ZGlmZiAtLWdpdCBhL3N5c3RlbS9saWJyYXJpZXMvTG9hZGVyLnBocCBiL3N5c3RlbS9saWJyYXJpZXMvTG9hZGVyLnBocAppbmRleCAzOGQ3YzM1Li5kMTE2MzA3IDEwMDY0NAotLS0gYS9zeXN0ZW0vbGlicmFyaWVzL0xvYWRlci5waHAKKysrIGIvc3lzdGVtL2xpYnJhcmllcy9Mb2FkZXIucGhwCkBAIC0xLDkzMSArMSw5MzEgQEAKLTw/cGhwICBpZiAoIWRlZmluZWQoJ0JBU0VQQVRIJykpIGV4aXQoJ05vIGRpcmVjdCBzY3JpcHQgYWNjZXNzIGFsbG93ZWQnKTsKLS8qKgotICogQ29kZSBJZ25pdGVyCi0gKgotICogQW4gb3BlbiBzb3VyY2UgYXBwbGljYXRpb24gZGV2ZWxvcG1lbnQgZnJhbWV3b3JrIGZvciBQSFAgNC4zLjIgb3IgbmV3ZXIKLSAqCi0gKiBAcGFja2FnZQkJQ29kZUlnbml0ZXIKLSAqIEBhdXRob3IJCVJpY2sgRWxsaXMKLSAqIEBjb3B5cmlnaHQJQ29weXJpZ2h0IChjKSAyMDA2LCBwTWFjaGluZSwgSW5jLgotICogQGxpY2Vuc2UJCWh0dHA6Ly93d3cuY29kZWlnbml0b3IuY29tL3VzZXJfZ3VpZGUvbGljZW5zZS5odG1sCi0gKiBAbGluawkJaHR0cDovL3d3dy5jb2RlaWduaXRlci5jb20KLSAqIEBzaW5jZQkJVmVyc2lvbiAxLjAKLSAqIEBmaWxlc291cmNlCi0gKi8KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLS8qKgotICogTG9hZGVyIENsYXNzCi0gKgotICogTG9hZHMgdmlld3MgYW5kIGZpbGVzCi0gKgotICogQHBhY2thZ2UJCUNvZGVJZ25pdGVyCi0gKiBAc3VicGFja2FnZQlMaWJyYXJpZXMKLSAqIEBhdXRob3IJCVJpY2sgRWxsaXMKLSAqIEBjYXRlZ29yeQlMb2FkZXIKLSAqIEBsaW5rCQlodHRwOi8vd3d3LmNvZGVpZ25pdGVyLmNvbS91c2VyX2d1aWRlL2xpYnJhcmllcy9sb2FkZXIuaHRtbAotICovCi1jbGFzcyBDSV9Mb2FkZXIgewotCi0JLy8gQWxsIHRoZXNlIGFyZSBzZXQgYXV0b21hdGljYWxseS4gRG9uJ3QgbWVzcyB3aXRoIHRoZW0uCi0JdmFyICRfY2lfb2JfbGV2ZWw7Ci0JdmFyICRfY2lfdmlld19wYXRoCQk9ICcnOwotCXZhciAkX2NpX2lzX3BocDUJCT0gRkFMU0U7Ci0JdmFyICRfY2lfaXNfaW5zdGFuY2UgCT0gRkFMU0U7IC8vIFdoZXRoZXIgd2Ugc2hvdWxkIHVzZSAkdGhpcyBvciAkQ0kgPSYgZ2V0X2luc3RhbmNlKCkKLQl2YXIgJF9jaV9jYWNoZWRfdmFycwk9IGFycmF5KCk7Ci0JdmFyICRfY2lfY2xhc3NlcwkJPSBhcnJheSgpOwotCXZhciAkX2NpX21vZGVscwkJCT0gYXJyYXkoKTsKLQl2YXIgJF9jaV9oZWxwZXJzCQk9IGFycmF5KCk7Ci0JdmFyICRfY2lfcGx1Z2lucwkJPSBhcnJheSgpOwotCXZhciAkX2NpX3NjcmlwdHMJCT0gYXJyYXkoKTsKLQl2YXIgJF9jaV92YXJtYXAJCQk9IGFycmF5KCd1bml0X3Rlc3QnID0+ICd1bml0JywgJ3VzZXJfYWdlbnQnID0+ICdhZ2VudCcpOwotCQotCi0JLyoqCi0JICogQ29uc3RydWN0b3IKLQkgKgotCSAqIFNldHMgdGhlIHBhdGggdG8gdGhlIHZpZXcgZmlsZXMgYW5kIGdldHMgdGhlIGluaXRpYWwgb3V0cHV0IGJ1ZmZlcmluZyBsZXZlbAotCSAqCi0JICogQGFjY2VzcwlwdWJsaWMKLQkgKi8KLQlmdW5jdGlvbiBDSV9Mb2FkZXIoKQotCXsJCi0JCSR0aGlzLT5fY2lfaXNfcGhwNSA9IChmbG9vcihwaHB2ZXJzaW9uKCkpID49IDUpID8gVFJVRSA6IEZBTFNFOwotCQkkdGhpcy0+X2NpX3ZpZXdfcGF0aCA9IEFQUFBBVEguJ3ZpZXdzLyc7Ci0JCSR0aGlzLT5fY2lfb2JfbGV2ZWwgID0gb2JfZ2V0X2xldmVsKCk7Ci0JCQkJCi0JCWxvZ19tZXNzYWdlKCdkZWJ1ZycsICJMb2FkZXIgQ2xhc3MgSW5pdGlhbGl6ZWQiKTsKLQl9Ci0JCi0JLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQkKLQkvKioKLQkgKiBDbGFzcyBMb2FkZXIKLQkgKgotCSAqIFRoaXMgZnVuY3Rpb24gbGV0cyB1c2VycyBsb2FkIGFuZCBpbnN0YW50aWF0ZSBjbGFzc2VzLgotCSAqIEl0IGlzIGRlc2lnbmVkIHRvIGJlIGNhbGxlZCBmcm9tIGEgdXNlcidzIGFwcCBjb250cm9sbGVycy4KLQkgKgotCSAqIEBhY2Nlc3MJcHVibGljCi0JICogQHBhcmFtCXN0cmluZwl0aGUgbmFtZSBvZiB0aGUgY2xhc3MKLQkgKiBAcGFyYW0JbWl4ZWQJdGhlIG9wdGlvbmFsIHBhcmFtZXRlcnMKLQkgKiBAcmV0dXJuCXZvaWQKLQkgKi8JCi0JZnVuY3Rpb24gbGlicmFyeSgkbGlicmFyeSA9ICcnLCAkcGFyYW1zID0gTlVMTCkKLQl7CQkKLQkJaWYgKCRsaWJyYXJ5ID09ICcnKQotCQl7Ci0JCQlyZXR1cm4gRkFMU0U7Ci0JCX0KLQotCQlpZiAoaXNfYXJyYXkoJGxpYnJhcnkpKQotCQl7Ci0JCQlmb3JlYWNoICgkbGlicmFyeSBhcyAkY2xhc3MpCi0JCQl7Ci0JCQkJJHRoaXMtPl9jaV9sb2FkX2NsYXNzKCRjbGFzcywgJHBhcmFtcyk7Ci0JCQl9Ci0JCX0KLQkJZWxzZQotCQl7Ci0JCQkkdGhpcy0+X2NpX2xvYWRfY2xhc3MoJGxpYnJhcnksICRwYXJhbXMpOwotCQl9Ci0JCQotCQkkdGhpcy0+X2NpX2Fzc2lnbl90b19tb2RlbHMoKTsKLQl9Ci0KLQkvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCQotCS8qKgotCSAqIE1vZGVsIExvYWRlcgotCSAqCi0JICogVGhpcyBmdW5jdGlvbiBsZXRzIHVzZXJzIGxvYWQgYW5kIGluc3RhbnRpYXRlIG1vZGVscy4KLQkgKgotCSAqIEBhY2Nlc3MJcHVibGljCi0JICogQHBhcmFtCXN0cmluZwl0aGUgbmFtZSBvZiB0aGUgY2xhc3MKLQkgKiBAcGFyYW0JbWl4ZWQJYW55IGluaXRpYWxpemF0aW9uIHBhcmFtZXRlcnMKLQkgKiBAcmV0dXJuCXZvaWQKLQkgKi8JCi0JZnVuY3Rpb24gbW9kZWwoJG1vZGVsLCAkbmFtZSA9ICcnLCAkZGJfY29ubiA9IEZBTFNFKQotCXsJCQotCQlpZiAoJG1vZGVsID09ICcnKQotCQkJcmV0dXJuOwotCQotCQkvLyBJcyB0aGUgbW9kZWwgaW4gYSBzdWItZm9sZGVyPyBJZiBzbywgcGFyc2Ugb3V0IHRoZSBmaWxlbmFtZSBhbmQgcGF0aC4KLQkJaWYgKHN0cnBvcygkbW9kZWwsICcvJykgPT09IEZBTFNFKQotCQl7Ci0JCQkkcGF0aCA9ICcnOwotCQl9Ci0JCWVsc2UKLQkJewotCQkJJHggPSBleHBsb2RlKCcvJywgJG1vZGVsKTsKLQkJCSRtb2RlbCA9IGVuZCgkeCk7CQkJCi0JCQl1bnNldCgkeFtjb3VudCgkeCktMV0pOwotCQkJJHBhdGggPSBpbXBsb2RlKCcvJywgJHgpLicvJzsKLQkJfQotCQotCQlpZiAoJG5hbWUgPT0gJycpCi0JCXsKLQkJCSRuYW1lID0gJG1vZGVsOwotCQl9Ci0JCQotCQlpZiAoaW5fYXJyYXkoJG5hbWUsICR0aGlzLT5fY2lfbW9kZWxzLCBUUlVFKSkKLQkJewotCQkJcmV0dXJuOwotCQl9Ci0JCQotCQkkQ0kgPSYgZ2V0X2luc3RhbmNlKCk7Ci0JCWlmIChpc3NldCgkQ0ktPiRuYW1lKSkKLQkJewotCQkJc2hvd19lcnJvcignVGhlIG1vZGVsIG5hbWUgeW91IGFyZSBsb2FkaW5nIGlzIHRoZSBuYW1lIG9mIGEgcmVzb3VyY2UgdGhhdCBpcyBhbHJlYWR5IGJlaW5nIHVzZWQ6ICcuJG5hbWUpOwotCQl9Ci0JCi0JCSRtb2RlbCA9IHN0cnRvbG93ZXIoJG1vZGVsKTsKLQkJCi0JCWlmICggISBmaWxlX2V4aXN0cyhBUFBQQVRILidtb2RlbHMvJy4kcGF0aC4kbW9kZWwuRVhUKSkKLQkJewotCQkJc2hvd19lcnJvcignVW5hYmxlIHRvIGxvY2F0ZSB0aGUgbW9kZWwgeW91IGhhdmUgc3BlY2lmaWVkOiAnLiRtb2RlbCk7Ci0JCX0KLQkJCQkKLQkJaWYgKCRkYl9jb25uICE9PSBGQUxTRSBBTkQgISBjbGFzc19leGlzdHMoJ0NJX0RCJykpCi0JCXsKLQkJCWlmICgkZGJfY29ubiA9PT0gVFJVRSkKLQkJCQkkZGJfY29ubiA9ICcnOwotCQkKLQkJCSRDSS0+bG9hZC0+ZGF0YWJhc2UoJGRiX2Nvbm4sIEZBTFNFLCBUUlVFKTsKLQkJfQotCQotCQlpZiAoICEgY2xhc3NfZXhpc3RzKCdNb2RlbCcpKQotCQl7Ci0JCQlyZXF1aXJlX29uY2UoQkFTRVBBVEguJ2xpYnJhcmllcy9Nb2RlbCcuRVhUKTsKLQkJfQotCi0JCXJlcXVpcmVfb25jZShBUFBQQVRILidtb2RlbHMvJy4kcGF0aC4kbW9kZWwuRVhUKTsKLQotCQkkbW9kZWwgPSB1Y2ZpcnN0KCRtb2RlbCk7Ci0JCQkJCi0JCSRDSS0+JG5hbWUgPSBuZXcgJG1vZGVsKCk7Ci0JCSRDSS0+JG5hbWUtPl9hc3NpZ25fbGlicmFyaWVzKCk7Ci0JCQotCQkkdGhpcy0+X2NpX21vZGVsc1tdID0gJG5hbWU7CQotCX0KLQkJCi0JLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQkKLQkvKioKLQkgKiBEYXRhYmFzZSBMb2FkZXIKLQkgKgotCSAqIEBhY2Nlc3MJcHVibGljCi0JICogQHBhcmFtCXN0cmluZwl0aGUgREIgY3JlZGVudGlhbHMKLQkgKiBAcGFyYW0JYm9vbAl3aGV0aGVyIHRvIHJldHVybiB0aGUgREIgb2JqZWN0Ci0JICogQHBhcmFtCWJvb2wJd2hldGhlciB0byBlbmFibGUgYWN0aXZlIHJlY29yZCAodGhpcyBhbGxvd3MgdXMgdG8gb3ZlcnJpZGUgdGhlIGNvbmZpZyBzZXR0aW5nKQotCSAqIEByZXR1cm4Jb2JqZWN0Ci0JICovCQotCWZ1bmN0aW9uIGRhdGFiYXNlKCRwYXJhbXMgPSAnJywgJHJldHVybiA9IEZBTFNFLCAkYWN0aXZlX3JlY29yZCA9IEZBTFNFKQotCXsKLQkJLy8gRG8gd2UgZXZlbiBuZWVkIHRvIGxvYWQgdGhlIGRhdGFiYXNlIGNsYXNzPwotCQlpZiAoY2xhc3NfZXhpc3RzKCdDSV9EQicpIEFORCAkcmV0dXJuID09IEZBTFNFIEFORCAkYWN0aXZlX3JlY29yZCA9PSBGQUxTRSkKLQkJewotCQkJcmV0dXJuIEZBTFNFOwotCQl9CQotCQotCQlyZXF1aXJlX29uY2UoQkFTRVBBVEguJ2RhdGFiYXNlL0RCJy5FWFQpOwotCi0JCWlmICgkcmV0dXJuID09PSBUUlVFKQotCQl7Ci0JCQlyZXR1cm4gREIoJHBhcmFtcywgJGFjdGl2ZV9yZWNvcmQpOwotCQl9Ci0KLQkJLy8gR3JhYiB0aGUgc3VwZXIgb2JqZWN0Ci0JCSRDSSA9JiBnZXRfaW5zdGFuY2UoKTsKLQkJCi0JCS8vIEluaXRpYWxpemUgdGhlIGRiIHZhcmlhYmxlLiAgTmVlZGVkIHRvIHByZXZlbnQgICAKLQkJLy8gcmVmZXJlbmNlIGVycm9ycyB3aXRoIHNvbWUgY29uZmlndXJhdGlvbnMKLQkJJENJLT5kYiA9ICcnOwotCQkKLQkJLy8gTG9hZCB0aGUgREIgY2xhc3MKLQkJJENJLT5kYiA9JiBEQigkcGFyYW1zLCAkYWN0aXZlX3JlY29yZCk7CQotCQkKLQkJLy8gQXNzaWduIHRoZSBEQiBvYmplY3QgdG8gYW55IGV4aXN0aW5nIG1vZGVscwotCQkkdGhpcy0+X2NpX2Fzc2lnbl90b19tb2RlbHMoKTsKLQl9Ci0JCi0JLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotCS8qKgotCSAqIExvYWQgdGhlIFV0aWxpdGllcyBDbGFzcwotCSAqCi0JICogQGFjY2VzcwlwdWJsaWMKLQkgKiBAcmV0dXJuCXN0cmluZwkJCi0JICovCQkKLQlmdW5jdGlvbiBkYnV0aWwoKQotCXsKLQkJaWYgKCAhIGNsYXNzX2V4aXN0cygnQ0lfREInKSkKLQkJewotCQkJJHRoaXMtPmRhdGFiYXNlKCk7Ci0JCX0KLQkJCi0JCSRDSSA9JiBnZXRfaW5zdGFuY2UoKTsKLQkKLQkJcmVxdWlyZV9vbmNlKEJBU0VQQVRILidkYXRhYmFzZS9EQl91dGlsaXR5Jy5FWFQpOwotCQlyZXF1aXJlX29uY2UoQkFTRVBBVEguJ2RhdGFiYXNlL2RyaXZlcnMvJy4kQ0ktPmRiLT5kYmRyaXZlci4nLycuJENJLT5kYi0+ZGJkcml2ZXIuJ191dGlsaXR5Jy5FWFQpOwotCQkkY2xhc3MgPSAnQ0lfREJfJy4kQ0ktPmRiLT5kYmRyaXZlci4nX3V0aWxpdHknOwotCi0JCSRDSS0+ZGJ1dGlsID0gbmV3ICRjbGFzcygpOwotCQkkQ0ktPmxvYWQtPl9jaV9hc3NpZ25fdG9fbW9kZWxzKCk7Ci0JfQotCQotCS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0JCi0JLyoqCi0JICogTG9hZCBWaWV3Ci0JICoKLQkgKiBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgdG8gbG9hZCBhICJ2aWV3IiBmaWxlLiAgSXQgaGFzIHRocmVlIHBhcmFtZXRlcnM6Ci0JICoKLQkgKiAxLiBUaGUgbmFtZSBvZiB0aGUgInZpZXciIGZpbGUgdG8gYmUgaW5jbHVkZWQuCi0JICogMi4gQW4gYXNzb2NpYXRpdmUgYXJyYXkgb2YgZGF0YSB0byBiZSBleHRyYWN0ZWQgZm9yIHVzZSBpbiB0aGUgdmlldy4KLQkgKiAzLiBUUlVFL0ZBTFNFIC0gd2hldGhlciB0byByZXR1cm4gdGhlIGRhdGEgb3IgbG9hZCBpdC4gIEluCi0JICogc29tZSBjYXNlcyBpdCdzIGFkdmFudGFnZW91cyB0byBiZSBhYmxlIHRvIHJldHVybiBkYXRhIHNvIHRoYXQKLQkgKiBhIGRldmVsb3BlciBjYW4gcHJvY2VzcyBpdCBpbiBzb21lIHdheS4KLQkgKgotCSAqIEBhY2Nlc3MJcHVibGljCi0JICogQHBhcmFtCXN0cmluZwotCSAqIEBwYXJhbQlhcnJheQotCSAqIEBwYXJhbQlib29sCi0JICogQHJldHVybgl2b2lkCi0JICovCi0JZnVuY3Rpb24gdmlldygkdmlldywgJHZhcnMgPSBhcnJheSgpLCAkcmV0dXJuID0gRkFMU0UpCi0JewotCQlyZXR1cm4gJHRoaXMtPl9jaV9sb2FkKGFycmF5KCd2aWV3JyA9PiAkdmlldywgJ3ZhcnMnID0+ICR0aGlzLT5fY2lfb2JqZWN0X3RvX2FycmF5KCR2YXJzKSwgJ3JldHVybicgPT4gJHJldHVybikpOwotCX0KLQkKLQkvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCQotCS8qKgotCSAqIExvYWQgRmlsZQotCSAqCi0JICogVGhpcyBpcyBhIGdlbmVyaWMgZmlsZSBsb2FkZXIKLQkgKgotCSAqIEBhY2Nlc3MJcHVibGljCi0JICogQHBhcmFtCXN0cmluZwotCSAqIEBwYXJhbQlib29sCi0JICogQHJldHVybglzdHJpbmcKLQkgKi8KLQlmdW5jdGlvbiBmaWxlKCRwYXRoLCAkcmV0dXJuID0gRkFMU0UpCi0JewotCQlyZXR1cm4gJHRoaXMtPl9jaV9sb2FkKGFycmF5KCdwYXRoJyA9PiAkcGF0aCwgJ3JldHVybicgPT4gJHJldHVybikpOwotCX0KLQkKLQkvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCQotCS8qKgotCSAqIFNldCBWYXJpYWJsZXMKLQkgKgotCSAqIE9uY2UgdmFyaWFibGVzIGFyZSBzZXQgdGhleSBiZWNvbWUgYXZhaWxhYmxlIHdpdGhpbgotCSAqIHRoZSBjb250cm9sbGVyIGNsYXNzIGFuZCBpdHMgInZpZXciIGZpbGVzLgotCSAqCi0JICogQGFjY2VzcwlwdWJsaWMKLQkgKiBAcGFyYW0JYXJyYXkKLQkgKiBAcmV0dXJuCXZvaWQKLQkgKi8KLQlmdW5jdGlvbiB2YXJzKCR2YXJzID0gYXJyYXkoKSkKLQl7Ci0JCSR2YXJzID0gJHRoaXMtPl9jaV9vYmplY3RfdG9fYXJyYXkoJHZhcnMpOwotCQotCQlpZiAoaXNfYXJyYXkoJHZhcnMpIEFORCBjb3VudCgkdmFycykgPiAwKQotCQl7Ci0JCQlmb3JlYWNoICgkdmFycyBhcyAka2V5ID0+ICR2YWwpCi0JCQl7Ci0JCQkJJHRoaXMtPl9jaV9jYWNoZWRfdmFyc1ska2V5XSA9ICR2YWw7Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQkKLQkvKioKLQkgKiBMb2FkIEhlbHBlcgotCSAqCi0JICogVGhpcyBmdW5jdGlvbiBsb2FkcyB0aGUgc3BlY2lmaWVkIGhlbHBlciBmaWxlLgotCSAqCi0JICogQGFjY2VzcwlwdWJsaWMKLQkgKiBAcGFyYW0JbWl4ZWQKLQkgKiBAcmV0dXJuCXZvaWQKLQkgKi8KLQlmdW5jdGlvbiBoZWxwZXIoJGhlbHBlcnMgPSBhcnJheSgpKQotCXsKLQkJaWYgKCAhIGlzX2FycmF5KCRoZWxwZXJzKSkKLQkJewotCQkJJGhlbHBlcnMgPSBhcnJheSgkaGVscGVycyk7Ci0JCX0KLQkKLQkJZm9yZWFjaCAoJGhlbHBlcnMgYXMgJGhlbHBlcikKLQkJewkJCi0JCQkkaGVscGVyID0gc3RydG9sb3dlcihzdHJfcmVwbGFjZShFWFQsICcnLCBzdHJfcmVwbGFjZSgnX2hlbHBlcicsICcnLCAkaGVscGVyKSkuJ19oZWxwZXInKTsKLQkJCi0JCQlpZiAoaXNzZXQoJHRoaXMtPl9jaV9oZWxwZXJzWyRoZWxwZXJdKSkKLQkJCXsKLQkJCQljb250aW51ZTsKLQkJCX0KLQotCQkJaWYgKGZpbGVfZXhpc3RzKEFQUFBBVEguJ2hlbHBlcnMvJy4kaGVscGVyLkVYVCkpCi0JCQl7IAotCQkJCWluY2x1ZGVfb25jZShBUFBQQVRILidoZWxwZXJzLycuJGhlbHBlci5FWFQpOwotCQkJfQotCQkJZWxzZQotCQkJewkJCi0JCQkJaWYgKGZpbGVfZXhpc3RzKEJBU0VQQVRILidoZWxwZXJzLycuJGhlbHBlci5FWFQpKQotCQkJCXsKLQkJCQkJaW5jbHVkZShCQVNFUEFUSC4naGVscGVycy8nLiRoZWxwZXIuRVhUKTsKLQkJCQl9Ci0JCQkJZWxzZQotCQkJCXsKLQkJCQkJc2hvd19lcnJvcignVW5hYmxlIHRvIGxvYWQgdGhlIHJlcXVlc3RlZCBmaWxlOiBoZWxwZXJzLycuJGhlbHBlci5FWFQpOwotCQkJCX0KLQkJCX0KLQotCQkJJHRoaXMtPl9jaV9oZWxwZXJzWyRoZWxwZXJdID0gVFJVRTsKLQkJCQotCQl9Ci0JCQotCQlsb2dfbWVzc2FnZSgnZGVidWcnLCAnSGVscGVycyBsb2FkZWQ6ICcuaW1wbG9kZSgnLCAnLCAkaGVscGVycykpOwotCX0KLQkKLQkvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCQotCS8qKgotCSAqIExvYWQgSGVscGVycwotCSAqCi0JICogVGhpcyBpcyBzaW1wbHkgYW4gYWxpYXMgdG8gdGhlIGFib3ZlIGZ1bmN0aW9uIGluIGNhc2UgdGhlCi0JICogdXNlciBoYXMgd3JpdHRlbiB0aGUgcGx1cmFsIGZvcm0gb2YgdGhpcyBmdW5jdGlvbi4KLQkgKgotCSAqIEBhY2Nlc3MJcHVibGljCi0JICogQHBhcmFtCWFycmF5Ci0JICogQHJldHVybgl2b2lkCi0JICovCi0JZnVuY3Rpb24gaGVscGVycygkaGVscGVycyA9IGFycmF5KCkpCi0JewotCQkkdGhpcy0+aGVscGVyKCRoZWxwZXJzKTsKLQl9Ci0JCi0JLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQkKLQkvKioKLQkgKiBMb2FkIFBsdWdpbgotCSAqCi0JICogVGhpcyBmdW5jdGlvbiBsb2FkcyB0aGUgc3BlY2lmaWVkIHBsdWdpbi4KLQkgKgotCSAqIEBhY2Nlc3MJcHVibGljCi0JICogQHBhcmFtCWFycmF5Ci0JICogQHJldHVybgl2b2lkCi0JICovCi0JZnVuY3Rpb24gcGx1Z2luKCRwbHVnaW5zID0gYXJyYXkoKSkKLQl7Ci0JCWlmICggISBpc19hcnJheSgkcGx1Z2lucykpCi0JCXsKLQkJCSRwbHVnaW5zID0gYXJyYXkoJHBsdWdpbnMpOwotCQl9Ci0JCi0JCWZvcmVhY2ggKCRwbHVnaW5zIGFzICRwbHVnaW4pCi0JCXsJCi0JCQkkcGx1Z2luID0gc3RydG9sb3dlcihzdHJfcmVwbGFjZShFWFQsICcnLCBzdHJfcmVwbGFjZSgnX3BsdWdpbi4nLCAnJywgJHBsdWdpbikpLidfcGknKTsJCQotCi0JCQlpZiAoaXNzZXQoJHRoaXMtPl9jaV9wbHVnaW5zWyRwbHVnaW5dKSkKLQkJCXsKLQkJCQljb250aW51ZTsKLQkJCX0KLQotCQkJaWYgKGZpbGVfZXhpc3RzKEFQUFBBVEguJ3BsdWdpbnMvJy4kcGx1Z2luLkVYVCkpCi0JCQl7Ci0JCQkJaW5jbHVkZShBUFBQQVRILidwbHVnaW5zLycuJHBsdWdpbi5FWFQpOwkKLQkJCX0KLQkJCWVsc2UKLQkJCXsKLQkJCQlpZiAoZmlsZV9leGlzdHMoQkFTRVBBVEguJ3BsdWdpbnMvJy4kcGx1Z2luLkVYVCkpCi0JCQkJewotCQkJCQlpbmNsdWRlKEJBU0VQQVRILidwbHVnaW5zLycuJHBsdWdpbi5FWFQpOwkKLQkJCQl9Ci0JCQkJZWxzZQotCQkJCXsKLQkJCQkJc2hvd19lcnJvcignVW5hYmxlIHRvIGxvYWQgdGhlIHJlcXVlc3RlZCBmaWxlOiBwbHVnaW5zLycuJHBsdWdpbi5FWFQpOwotCQkJCX0KLQkJCX0KLQkJCQotCQkJJHRoaXMtPl9jaV9wbHVnaW5zWyRwbHVnaW5dID0gVFJVRTsKLQkJfQotCQkKLQkJbG9nX21lc3NhZ2UoJ2RlYnVnJywgJ1BsdWdpbnMgbG9hZGVkOiAnLmltcGxvZGUoJywgJywgJHBsdWdpbnMpKTsKLQl9Ci0KLQkvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCQotCS8qKgotCSAqIExvYWQgUGx1Z2lucwotCSAqCi0JICogVGhpcyBpcyBzaW1wbHkgYW4gYWxpYXMgdG8gdGhlIGFib3ZlIGZ1bmN0aW9uIGluIGNhc2UgdGhlCi0JICogdXNlciBoYXMgd3JpdHRlbiB0aGUgcGx1cmFsIGZvcm0gb2YgdGhpcyBmdW5jdGlvbi4KLQkgKgotCSAqIEBhY2Nlc3MJcHVibGljCi0JICogQHBhcmFtCWFycmF5Ci0JICogQHJldHVybgl2b2lkCi0JICovCi0JZnVuY3Rpb24gcGx1Z2lucygkcGx1Z2lucyA9IGFycmF5KCkpCi0JewotCQkkdGhpcy0+cGx1Z2luKCRwbHVnaW5zKTsKLQl9Ci0KLQkvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCQotCS8qKgotCSAqIExvYWQgU2NyaXB0Ci0JICoKLQkgKiBUaGlzIGZ1bmN0aW9uIGxvYWRzIHRoZSBzcGVjaWZpZWQgaW5jbHVkZSBmaWxlIGZyb20gdGhlCi0JICogYXBwbGljYXRpb24vc2NyaXB0cy8gZm9sZGVyLgotCSAqCi0JICogTk9URTogIFRoaXMgZmVhdHVyZSBoYXMgYmVlbiBkZXByZWNhdGVkIGJ1dCBpdCB3aWxsIHJlbWFpbiBhdmFpbGFibGUKLQkgKiBmb3IgbGVnYWN5IHVzZXJzLgotCSAqCi0JICogQGFjY2VzcwlwdWJsaWMKLQkgKiBAcGFyYW0JYXJyYXkKLQkgKiBAcmV0dXJuCXZvaWQKLQkgKi8KLQlmdW5jdGlvbiBzY3JpcHQoJHNjcmlwdHMgPSBhcnJheSgpKQotCXsKLQkJaWYgKCAhIGlzX2FycmF5KCRzY3JpcHRzKSkKLQkJewotCQkJJHNjcmlwdHMgPSBhcnJheSgkc2NyaXB0cyk7Ci0JCX0KLQkKLQkJZm9yZWFjaCAoJHNjcmlwdHMgYXMgJHNjcmlwdCkKLQkJewkKLQkJCSRzY3JpcHQgPSBzdHJ0b2xvd2VyKHN0cl9yZXBsYWNlKEVYVCwgJycsICRzY3JpcHQpKTsKLQotCQkJaWYgKGlzc2V0KCR0aGlzLT5fY2lfc2NyaXB0c1skc2NyaXB0XSkpCi0JCQl7Ci0JCQkJY29udGludWU7Ci0JCQl9Ci0JCQotCQkJaWYgKCAhIGZpbGVfZXhpc3RzKEFQUFBBVEguJ3NjcmlwdHMvJy4kc2NyaXB0LkVYVCkpCi0JCQl7Ci0JCQkJc2hvd19lcnJvcignVW5hYmxlIHRvIGxvYWQgdGhlIHJlcXVlc3RlZCBzY3JpcHQ6IHNjcmlwdHMvJy4kc2NyaXB0LkVYVCk7Ci0JCQl9Ci0JCQkKLQkJCWluY2x1ZGUoQVBQUEFUSC4nc2NyaXB0cy8nLiRzY3JpcHQuRVhUKTsKLQkJfQotCQkKLQkJbG9nX21lc3NhZ2UoJ2RlYnVnJywgJ1NjcmlwdHMgbG9hZGVkOiAnLmltcGxvZGUoJywgJywgJHNjcmlwdHMpKTsKLQl9Ci0JCQotCS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0JCi0JLyoqCi0JICogTG9hZHMgYSBsYW5ndWFnZSBmaWxlCi0JICoKLQkgKiBAYWNjZXNzCXB1YmxpYwotCSAqIEBwYXJhbQlzdHJpbmcKLQkgKiBAcmV0dXJuCXZvaWQKLQkgKi8KLQlmdW5jdGlvbiBsYW5ndWFnZSgkZmlsZSA9ICcnLCAkbGFuZyA9ICcnLCAkcmV0dXJuID0gRkFMU0UpCi0JewotCQkkQ0kgPSYgZ2V0X2luc3RhbmNlKCk7Ci0JCXJldHVybiAkQ0ktPmxhbmctPmxvYWQoJGZpbGUsICRsYW5nLCAkcmV0dXJuKTsKLQl9Ci0JCi0JLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQkKLQkvKioKLQkgKiBMb2FkcyBhIGNvbmZpZyBmaWxlCi0JICoKLQkgKiBAYWNjZXNzCXB1YmxpYwotCSAqIEBwYXJhbQlzdHJpbmcKLQkgKiBAcmV0dXJuCXZvaWQKLQkgKi8KLQlmdW5jdGlvbiBjb25maWcoJGZpbGUgPSAnJywgJHVzZV9zZWN0aW9ucyA9IEZBTFNFLCAkZmFpbF9ncmFjZWZ1bGx5ID0gRkFMU0UpCi0JewkJCQotCQkkQ0kgPSYgZ2V0X2luc3RhbmNlKCk7Ci0JCSRDSS0+Y29uZmlnLT5sb2FkKCRmaWxlLCAkdXNlX3NlY3Rpb25zLCAkZmFpbF9ncmFjZWZ1bGx5KTsKLQl9Ci0KLQkvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCQotCS8qKgotCSAqIFNjYWZmb2xkaW5nIExvYWRlcgotCSAqCi0JICogVGhpcyBpbml0aWFsaXppbmcgZnVuY3Rpb24gd29ya3MgYSBiaXQgZGlmZmVyZW50IHRoYW4gdGhlCi0JICogb3RoZXJzLiBJdCBkb2Vzbid0IGxvYWQgdGhlIGNsYXNzLiAgSW5zdGVhZCwgaXQgc2ltcGx5Ci0JICogc2V0cyBhIGZsYWcgaW5kaWNhdGluZyB0aGF0IHNjYWZmb2xkaW5nIGlzIGFsbG93ZWQgdG8gYmUKLQkgKiB1c2VkLiAgVGhlIGFjdHVhbCBzY2FmZm9sZGluZyBmdW5jdGlvbiBiZWxvdyBpcwotCSAqIGNhbGxlZCBieSB0aGUgZnJvbnQgY29udHJvbGxlciBiYXNlZCBvbiB3aGV0aGVyIHRoZQotCSAqIHNlY29uZCBzZWdtZW50IG9mIHRoZSBVUkwgbWF0Y2hlcyB0aGUgInNlY3JldCIgc2NhZmZvbGRpbmcKLQkgKiB3b3JkIHN0b3JlZCBpbiB0aGUgYXBwbGljYXRpb24vY29uZmlnL3JvdXRlcy5waHAKLQkgKgotCSAqIEBhY2Nlc3MJcHVibGljCi0JICogQHBhcmFtCXN0cmluZwotCSAqIEByZXR1cm4Jdm9pZAotCSAqLwkKLQlmdW5jdGlvbiBzY2FmZm9sZGluZygkdGFibGUgPSAnJykKLQl7CQkKLQkJaWYgKCR0YWJsZSA9PT0gRkFMU0UpCi0JCXsKLQkJCXNob3dfZXJyb3IoJ1lvdSBtdXN0IGluY2x1ZGUgdGhlIG5hbWUgb2YgdGhlIHRhYmxlIHlvdSB3b3VsZCBsaWtlIGFjY2VzcyB3aGVuIHlvdSBpbml0aWFsaXplIHNjYWZmb2xkaW5nJyk7Ci0JCX0KLQkJCi0JCSRDSSA9JiBnZXRfaW5zdGFuY2UoKTsKLQkJJENJLT5fY2lfc2NhZmZvbGRpbmcgPSBUUlVFOwotCQkkQ0ktPl9jaV9zY2FmZl90YWJsZSA9ICR0YWJsZTsKLQl9Ci0KLQkvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCQkKLQkvKioKLQkgKiBMb2FkZXIKLQkgKgotCSAqIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCB0byBsb2FkIHZpZXdzIGFuZCBmaWxlcy4KLQkgKgotCSAqIEBhY2Nlc3MJcHJpdmF0ZQotCSAqIEBwYXJhbQlhcnJheQotCSAqIEByZXR1cm4Jdm9pZAotCSAqLwotCWZ1bmN0aW9uIF9jaV9sb2FkKCRkYXRhKQotCXsKLQkJLy8gU2V0IHRoZSBkZWZhdWx0IGRhdGEgdmFyaWFibGVzCi0JCWZvcmVhY2ggKGFycmF5KCd2aWV3JywgJ3ZhcnMnLCAncGF0aCcsICdyZXR1cm4nKSBhcyAkdmFsKQotCQl7Ci0JCQkkJHZhbCA9ICggISBpc3NldCgkZGF0YVskdmFsXSkpID8gRkFMU0UgOiAkZGF0YVskdmFsXTsKLQkJfQotCi0JCS8vIFNldCB0aGUgcGF0aCB0byB0aGUgcmVxdWVzdGVkIGZpbGUKLQkJaWYgKCRwYXRoID09ICcnKQotCQl7Ci0JCQkkZXh0ID0gcGF0aGluZm8oJHZpZXcsIFBBVEhJTkZPX0VYVEVOU0lPTik7Ci0JCQkkZmlsZSA9ICgkZXh0ID09ICcnKSA/ICR2aWV3LkVYVCA6ICR2aWV3OwotCQkJJHBhdGggPSAkdGhpcy0+X2NpX3ZpZXdfcGF0aC4kZmlsZTsKLQkJfQotCQllbHNlCi0JCXsKLQkJCSR4ID0gZXhwbG9kZSgnLycsICRwYXRoKTsKLQkJCSRmaWxlID0gZW5kKCR4KTsKLQkJfQotCQkKLQkJaWYgKCAhIGZpbGVfZXhpc3RzKCRwYXRoKSkKLQkJewotCQkJc2hvd19lcnJvcignVW5hYmxlIHRvIGxvYWQgdGhlIHJlcXVlc3RlZCBmaWxlOiAnLiRmaWxlKTsKLQkJfQotCQotCQkvLyBUaGlzIGFsbG93cyBhbnl0aGluZyBsb2FkZWQgdXNpbmcgJHRoaXMtPmxvYWQgKHZpZXdzLCBmaWxlcywgZXRjLikKLQkJLy8gdG8gYmVjb21lIGFjY2Vzc2libGUgZnJvbSB3aXRoaW4gdGhlIENvbnRyb2xsZXIgYW5kIE1vZGVsIGZ1bmN0aW9ucy4KLQkJLy8gT25seSBuZWVkZWQgd2hlbiBydW5uaW5nIFBIUCA1Ci0JCQotCQlpZiAoJHRoaXMtPl9jaV9pc19pbnN0YW5jZSgpKQotCQl7Ci0JCQkkQ0kgPSYgZ2V0X2luc3RhbmNlKCk7Ci0JCQlmb3JlYWNoIChnZXRfb2JqZWN0X3ZhcnMoJENJKSBhcyAka2V5ID0+ICR2YXIpCi0JCQl7Ci0JCQkJaWYgKCAhIGlzc2V0KCR0aGlzLT4ka2V5KSkKLQkJCQl7Ci0JCQkJCSR0aGlzLT4ka2V5ID0mICRDSS0+JGtleTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJCi0JCS8qCi0JCSAqIEV4dHJhY3QgYW5kIGNhY2hlIHZhcmlhYmxlcwotCQkgKgotCQkgKiBZb3UgY2FuIGVpdGhlciBzZXQgdmFyaWFibGVzIHVzaW5nIHRoZSBkZWRpY2F0ZWQgJHRoaXMtPmxvYWRfdmFycygpCi0JCSAqIGZ1bmN0aW9uIG9yIHZpYSB0aGUgc2Vjb25kIHBhcmFtZXRlciBvZiB0aGlzIGZ1bmN0aW9uLiBXZSdsbCBtZXJnZQotCQkgKiB0aGUgdHdvIHR5cGVzIGFuZCBjYWNoZSB0aGVtIHNvIHRoYXQgdmlld3MgdGhhdCBhcmUgZW1iZWRkZWQgd2l0aGluCi0JCSAqIG90aGVyIHZpZXdzIGNhbiBoYXZlIGFjY2VzcyB0byB0aGVzZSB2YXJpYWJsZXMuCi0JCSAqLwkKLQkJaWYgKGlzX2FycmF5KCR2YXJzKSkKLQkJewotCQkJJHRoaXMtPl9jaV9jYWNoZWRfdmFycyA9IGFycmF5X21lcmdlKCR0aGlzLT5fY2lfY2FjaGVkX3ZhcnMsICR2YXJzKTsKLQkJfQotCQlleHRyYWN0KCR0aGlzLT5fY2lfY2FjaGVkX3ZhcnMpOwotCQkJCQotCQkvKgotCQkgKiBCdWZmZXIgdGhlIG91dHB1dAotCQkgKgotCQkgKiBXZSBidWZmZXIgdGhlIG91dHB1dCBmb3IgdHdvIHJlYXNvbnM6Ci0JCSAqIDEuIFNwZWVkLiBZb3UgZ2V0IGEgc2lnbmlmaWNhbnQgc3BlZWQgYm9vc3QuCi0JCSAqIDIuIFNvIHRoYXQgdGhlIGZpbmFsIHJlbmRlcmVkIHRlbXBsYXRlIGNhbiBiZQotCQkgKiBwb3N0LXByb2Nlc3NlZCBieSB0aGUgb3V0cHV0IGNsYXNzLiAgV2h5IGRvIHdlCi0JCSAqIG5lZWQgcG9zdCBwcm9jZXNzaW5nPyAgRm9yIG9uZSB0aGluZywgaW4gb3JkZXIgdG8KLQkJICogc2hvdyB0aGUgZWxhcHNlZCBwYWdlIGxvYWQgdGltZS4gIFVubGVzcyB3ZQotCQkgKiBjYW4gaW50ZXJjZXB0IHRoZSBjb250ZW50IHJpZ2h0IGJlZm9yZSBpdCdzIHNlbnQgdG8KLQkJICogdGhlIGJyb3dzZXIgYW5kIHRoZW4gc3RvcCB0aGUgdGltZXIgaXQgd29uJ3QgYmUgYWNjdXJhdGUuCi0JCSAqLwotCQlvYl9zdGFydCgpOwotCQkJCQotCQkvLyBJZiB0aGUgUEhQIGluc3RhbGxhdGlvbiBkb2VzIG5vdCBzdXBwb3J0IHNob3J0IHRhZ3Mgd2UnbGwKLQkJLy8gZG8gYSBsaXR0bGUgc3RyaW5nIHJlcGxhY2VtZW50LCBjaGFuZ2luZyB0aGUgc2hvcnQgdGFncwotCQkvLyB0byBzdGFuZGFyZCBQSFAgZWNobyBzdGF0ZW1lbnRzLgotCQkKLQkJaWYgKChib29sKSBAaW5pX2dldCgnc2hvcnRfb3Blbl90YWcnKSA9PT0gRkFMU0UgQU5EIGNvbmZpZ19pdGVtKCdyZXdyaXRlX3Nob3J0X3RhZ3MnKSA9PSBUUlVFKQotCQl7Ci0JCQllY2hvIGV2YWwoJz8+Jy5wcmVnX3JlcGxhY2UoIi87KlxzKlw/Pi8iLCAiOyA/PiIsIHN0cl9yZXBsYWNlKCc8Pz0nLCAnPD9waHAgZWNobyAnLCBmaWxlX2dldF9jb250ZW50cygkcGF0aCkpKS4nPD9waHAgJyk7Ci0JCX0KLQkJZWxzZQotCQl7Ci0JCQlpbmNsdWRlKCRwYXRoKTsKLQkJfQotCQkKLQkJbG9nX21lc3NhZ2UoJ2RlYnVnJywgJ0ZpbGUgbG9hZGVkOiAnLiRwYXRoKTsKLQkJCi0JCS8vIFJldHVybiB0aGUgZmlsZSBkYXRhIGlmIHJlcXVlc3RlZAotCQlpZiAoJHJldHVybiA9PT0gVFJVRSkKLQkJewkJCi0JCQkkYnVmZmVyID0gb2JfZ2V0X2NvbnRlbnRzKCk7Ci0JCQlAb2JfZW5kX2NsZWFuKCk7Ci0JCQlyZXR1cm4gJGJ1ZmZlcjsKLQkJfQotCi0JCS8qCi0JCSAqIEZsdXNoIHRoZSBidWZmZXIuLi4gb3IgYnVmZiB0aGUgZmx1c2hlcj8KLQkJICoKLQkJICogSW4gb3JkZXIgdG8gcGVybWl0IHZpZXdzIHRvIGJlIG5lc3RlZCB3aXRoaW4KLQkJICogb3RoZXIgdmlld3MsIHdlIG5lZWQgdG8gZmx1c2ggdGhlIGNvbnRlbnQgYmFjayBvdXQgd2hlbmV2ZXIKLQkJICogd2UgYXJlIGJleW9uZCB0aGUgZmlyc3QgbGV2ZWwgb2Ygb3V0cHV0IGJ1ZmZlcmluZyBzbyB0aGF0Ci0JCSAqIGl0IGNhbiBiZSBzZWVuIGFuZCBpbmNsdWRlZCBwcm9wZXJseSBieSB0aGUgZmlyc3QgaW5jbHVkZWQKLQkJICogdGVtcGxhdGUgYW5kIGFueSBzdWJzZXF1ZW50IG9uZXMuIE95IQotCQkgKgotCQkgKi8JCi0JCWlmIChvYl9nZXRfbGV2ZWwoKSA+ICR0aGlzLT5fY2lfb2JfbGV2ZWwgKyAxKQotCQl7Ci0JCQlvYl9lbmRfZmx1c2goKTsKLQkJfQotCQllbHNlCi0JCXsKLQkJCS8vIFBIUCA0IHJlcXVpcmVzIHRoYXQgd2UgdXNlIGEgZ2xvYmFsCi0JCQlnbG9iYWwgJE9VVDsKLQkJCSRPVVQtPnNldF9vdXRwdXQob2JfZ2V0X2NvbnRlbnRzKCkpOwotCQkJQG9iX2VuZF9jbGVhbigpOwotCQl9Ci0JfQotCi0JLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotCS8qKgotCSAqIExvYWQgY2xhc3MKLQkgKgotCSAqIFRoaXMgZnVuY3Rpb24gbG9hZHMgdGhlIHJlcXVlc3RlZCBjbGFzcy4KLQkgKgotCSAqIEBhY2Nlc3MJcHJpdmF0ZQotCSAqIEBwYXJhbSAJc3RyaW5nCXRoZSBpdGVtIHRoYXQgaXMgYmVpbmcgbG9hZGVkCi0JICogQHBhcmFtCW1peGVkCWFueSBhZGRpdGlvbmFsIHBhcmFtZXRlcnMKLQkgKiBAcmV0dXJuIAl2b2lkCi0JICovCi0JZnVuY3Rpb24gX2NpX2xvYWRfY2xhc3MoJGNsYXNzLCAkcGFyYW1zID0gTlVMTCkKLQl7CQotCQkvLyBHZXQgdGhlIGNsYXNzIG5hbWUKLQkJJGNsYXNzID0gc3RyX3JlcGxhY2UoRVhULCAnJywgJGNsYXNzKTsKLQotCQkvLyBXZSdsbCB0ZXN0IGZvciBib3RoIGxvd2VyY2FzZSBhbmQgY2FwaXRhbGl6ZWQgdmVyc2lvbnMgb2YgdGhlIGZpbGUgbmFtZQotCQlmb3JlYWNoIChhcnJheSh1Y2ZpcnN0KCRjbGFzcyksIHN0cnRvbG93ZXIoJGNsYXNzKSkgYXMgJGNsYXNzKQotCQl7Ci0JCQkvLyBJcyB0aGlzIGEgY2xhc3MgZXh0ZW5zaW9uIHJlcXVlc3Q/Ci0JCQlpZiAoZmlsZV9leGlzdHMoQVBQUEFUSC4nbGlicmFyaWVzLycuY29uZmlnX2l0ZW0oJ3N1YmNsYXNzX3ByZWZpeCcpLiRjbGFzcy5FWFQpKQotCQkJewotCQkJCWlmICggISBmaWxlX2V4aXN0cyhCQVNFUEFUSC4nbGlicmFyaWVzLycudWNmaXJzdCgkY2xhc3MpLkVYVCkpCi0JCQkJewotCQkJCQlsb2dfbWVzc2FnZSgnZXJyb3InLCAiVW5hYmxlIHRvIGxvYWQgdGhlIHJlcXVlc3RlZCBjbGFzczogIi4kY2xhc3MpOwotCQkJCQlzaG93X2Vycm9yKCJVbmFibGUgdG8gbG9hZCB0aGUgcmVxdWVzdGVkIGNsYXNzOiAiLiRjbGFzcyk7Ci0JCQkJfQotCQotCQkJCWluY2x1ZGUoQkFTRVBBVEguJ2xpYnJhcmllcy8nLnVjZmlyc3QoJGNsYXNzKS5FWFQpOwotCQkJCWluY2x1ZGUoQVBQUEFUSC4nbGlicmFyaWVzLycuY29uZmlnX2l0ZW0oJ3N1YmNsYXNzX3ByZWZpeCcpLiRjbGFzcy5FWFQpOwotCQotCQkJCXJldHVybiAkdGhpcy0+X2NpX2luaXRfY2xhc3MoJGNsYXNzLCBjb25maWdfaXRlbSgnc3ViY2xhc3NfcHJlZml4JyksICRwYXJhbXMpOwkJCQotCQkJfQotCQkKLQkJCS8vIExldHMgc2VhcmNoIGZvciB0aGUgcmVxdWVzdGVkIGxpYnJhcnkgZmlsZSBhbmQgbG9hZCBpdC4KLQkJCWZvciAoJGkgPSAxOyAkaSA8IDM7ICRpKyspCi0JCQl7Ci0JCQkJJHBhdGggPSAoJGkgJSAyKSA/IEFQUFBBVEggOiBCQVNFUEFUSDsJCi0JCQkJJGZwID0gJHBhdGguJ2xpYnJhcmllcy8nLiRjbGFzcy5FWFQ7Ci0JCQkJCi0JCQkJLy8gRG9lcyB0aGUgZmlsZSBleGlzdD8gIE5vPyAgQnVtbWVyLi4uCi0JCQkJaWYgKCAhIGZpbGVfZXhpc3RzKCRmcCkpCi0JCQkJewotCQkJCQljb250aW51ZTsKLQkJCQl9Ci0JCQkJCi0JCQkJLy8gU2FmZXR5OiAgV2FzIHRoZSBjbGFzcyBhbHJlYWR5IGxvYWRlZCBieSBhIHByZXZpb3VzIGNhbGw/Ci0JCQkJaWYgKGluX2FycmF5KCRmcCwgJHRoaXMtPl9jaV9jbGFzc2VzKSkKLQkJCQl7Ci0JCQkJCWxvZ19tZXNzYWdlKCdkZWJ1ZycsICRjbGFzcy4iIGNsYXNzIGFscmVhZHkgbG9hZGVkLsogU2Vjb25kIGF0dGVtcHQgaWdub3JlZC4iKTsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQkJCQkKLQkJCQlpbmNsdWRlKCRmcCk7Ci0JCQkJJHRoaXMtPl9jaV9jbGFzc2VzW10gPSAkZnA7Ci0JCQkJcmV0dXJuICR0aGlzLT5fY2lfaW5pdF9jbGFzcygkY2xhc3MsICcnLCAkcGFyYW1zKTsKLQkJCX0KLQkJfSAvLyBFTkQgRk9SRUFDSAotCQkKLQkJLy8gSWYgd2UgZ290IHRoaXMgZmFyIHdlIHdlcmUgdW5hYmxlIHRvIGZpbmQgdGhlIHJlcXVlc3RlZCBjbGFzcy4KLQkJLy8gV2UgZG8gbm90IGlzc3VlIGVycm9ycyBpZiB0aGUgbG9hZCBjYWxsIGZhaWxlZCBkdWUgdG8gYSBkdXBsaWNhdGUgcmVxdWVzdAotCQlpZiAoJGlzX2R1cGxpY2F0ZSA9PSBGQUxTRSkKLQkJewotCQkJbG9nX21lc3NhZ2UoJ2Vycm9yJywgIlVuYWJsZSB0byBsb2FkIHRoZSByZXF1ZXN0ZWQgY2xhc3M6ICIuJGNsYXNzKTsKLQkJCXNob3dfZXJyb3IoIlVuYWJsZSB0byBsb2FkIHRoZSByZXF1ZXN0ZWQgY2xhc3M6ICIuJGNsYXNzKTsKLQkJfQotCX0KLQkKLQkvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0JLyoqCi0JICogSW5zdGFudGlhdGVzIGEgY2xhc3MKLQkgKgotCSAqIEBhY2Nlc3MJcHJpdmF0ZQotCSAqIEBwYXJhbQlzdHJpbmcKLQkgKiBAcGFyYW0Jc3RyaW5nCi0JICogQHJldHVybgludWxsCi0JICovCi0JZnVuY3Rpb24gX2NpX2luaXRfY2xhc3MoJGNsYXNzLCAkcHJlZml4ID0gJycsICRjb25maWcgPSBGQUxTRSkKLQl7CQotCQkvLyBJcyB0aGVyZSBhbiBhc3NvY2lhdGVkIGNvbmZpZyBmaWxlIGZvciB0aGlzIGNsYXNzPwotCQlpZiAoJGNvbmZpZyA9PT0gTlVMTCkKLQkJewotCQkJJGNvbmZpZyA9IE5VTEw7Ci0JCQlpZiAoZmlsZV9leGlzdHMoQVBQUEFUSC4nY29uZmlnLycuJGNsYXNzLkVYVCkpCi0JCQl7Ci0JCQkJaW5jbHVkZShBUFBQQVRILidjb25maWcvJy4kY2xhc3MuRVhUKTsKLQkJCX0KLQkJfQotCQkKLQkJaWYgKCRwcmVmaXggPT0gJycpCi0JCXsKLQkJCSRuYW1lID0gKGNsYXNzX2V4aXN0cygnQ0lfJy4kY2xhc3MpKSA/ICdDSV8nLiRjbGFzcyA6ICRjbGFzczsKLQkJfQotCQllbHNlCi0JCXsKLQkJCSRuYW1lID0gJHByZWZpeC4kY2xhc3M7Ci0JCX0KLQkJCi0JCS8vIFNldCB0aGUgdmFyaWFibGUgbmFtZSB3ZSB3aWxsIGFzc2lnbiB0aGUgY2xhc3MgdG8KLQkJJGNsYXNzID0gc3RydG9sb3dlcigkY2xhc3MpOwkJCQotCQkkY2xhc3N2YXIgPSAoICEgaXNzZXQoJHRoaXMtPl9jaV92YXJtYXBbJGNsYXNzXSkpID8gJGNsYXNzIDogJHRoaXMtPl9jaV92YXJtYXBbJGNsYXNzXTsKLQkJCQkKLQkJLy8gSW5zdGFudGlhdGUgdGhlIGNsYXNzCQkKLQkJJENJID0mIGdldF9pbnN0YW5jZSgpOwotCQlpZiAoJGNvbmZpZyAhPT0gTlVMTCkKLQkJewotCQkJJENJLT4kY2xhc3N2YXIgPSBuZXcgJG5hbWUoJGNvbmZpZyk7Ci0JCX0KLQkJZWxzZQotCQl7CQkKLQkJCSRDSS0+JGNsYXNzdmFyID0gbmV3ICRuYW1lOwotCQl9CQotCX0gCQotCQotCS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0JCi0JLyoqCi0JICogQXV0b2xvYWRlcgotCSAqCi0JICogVGhlIGNvbmZpZy9hdXRvbG9hZC5waHAgZmlsZSBjb250YWlucyBhbiBhcnJheSB0aGF0IHBlcm1pdHMgc3ViLXN5c3RlbXMsCi0JICogbGlicmFyaWVzLCBwbHVnaW5zLCBhbmQgaGVscGVycyB0byBiZSBsb2FkZWQgYXV0b21hdGljYWxseS4KLQkgKgotCSAqIEBhY2Nlc3MJcHJpdmF0ZQotCSAqIEBwYXJhbQlhcnJheQotCSAqIEByZXR1cm4Jdm9pZAotCSAqLwotCWZ1bmN0aW9uIF9jaV9hdXRvbG9hZGVyKCkKLQl7CQotCQlpbmNsdWRlKEFQUFBBVEguJ2NvbmZpZy9hdXRvbG9hZCcuRVhUKTsKLQkJCi0JCWlmICggISBpc3NldCgkYXV0b2xvYWQpKQotCQl7Ci0JCQlyZXR1cm4gRkFMU0U7Ci0JCX0KLQkJCi0JCS8vIExvYWQgYW55IGN1c3RvbWUgY29uZmlnIGZpbGUKLQkJaWYgKGNvdW50KCRhdXRvbG9hZFsnY29uZmlnJ10pID4gMCkKLQkJewkJCQotCQkJJENJID0mIGdldF9pbnN0YW5jZSgpOwotCQkJZm9yZWFjaCAoJGF1dG9sb2FkWydjb25maWcnXSBhcyAka2V5ID0+ICR2YWwpCi0JCQl7Ci0JCQkJJENJLT5jb25maWctPmxvYWQoJHZhbCk7Ci0JCQl9Ci0JCX0JCQotCi0JCS8vIExvYWQgcGx1Z2lucywgaGVscGVycywgYW5kIHNjcmlwdHMKLQkJZm9yZWFjaCAoYXJyYXkoJ2hlbHBlcicsICdwbHVnaW4nLCAnc2NyaXB0JykgYXMgJHR5cGUpCi0JCXsKLQkJCWlmIChpc3NldCgkYXV0b2xvYWRbJHR5cGVdKSBBTkQgY291bnQoJGF1dG9sb2FkWyR0eXBlXSkgPiAwKQotCQkJewotCQkJCSR0aGlzLT4kdHlwZSgkYXV0b2xvYWRbJHR5cGVdKTsKLQkJCX0JCQotCQl9Ci0JCQotCQkvLyBBIGxpdHRsZSB0d2VhayB0byByZW1haW4gYmFja3dhcmQgY29tcGF0aWJsZQotCQkvLyBUaGUgJGF1dG9sb2FkWydjb3JlJ10gaXRlbSB3YXMgZGVwcmVjYXRlZAotCQlpZiAoICEgaXNzZXQoJGF1dG9sb2FkWydsaWJyYXJpZXMnXSkpCi0JCXsKLQkJCSRhdXRvbG9hZFsnbGlicmFyaWVzJ10gPSAkYXV0b2xvYWRbJ2NvcmUnXTsKLQkJfQotCQkKLQkJLy8gTG9hZCBsaWJyYXJpZXMKLQkJaWYgKGlzc2V0KCRhdXRvbG9hZFsnbGlicmFyaWVzJ10pIEFORCBjb3VudCgkYXV0b2xvYWRbJ2xpYnJhcmllcyddKSA+IDApCi0JCXsKLQkJCS8vIExvYWQgdGhlIGRhdGFiYXNlIGRyaXZlci4KLQkJCWlmIChpbl9hcnJheSgnZGF0YWJhc2UnLCAkYXV0b2xvYWRbJ2xpYnJhcmllcyddKSkKLQkJCXsKLQkJCQkkdGhpcy0+ZGF0YWJhc2UoKTsKLQkJCQkkYXV0b2xvYWRbJ2xpYnJhcmllcyddID0gYXJyYXlfZGlmZigkYXV0b2xvYWRbJ2xpYnJhcmllcyddLCBhcnJheSgnZGF0YWJhc2UnKSk7Ci0JCQl9Ci0KLQkJCS8vIExvYWQgdGhlIG1vZGVsIGNsYXNzLgotCQkJaWYgKGluX2FycmF5KCdtb2RlbCcsICRhdXRvbG9hZFsnbGlicmFyaWVzJ10pKQotCQkJewotCQkJCSR0aGlzLT5tb2RlbCgpOwotCQkJCSRhdXRvbG9hZFsnbGlicmFyaWVzJ10gPSBhcnJheV9kaWZmKCRhdXRvbG9hZFsnbGlicmFyaWVzJ10sIGFycmF5KCdtb2RlbCcpKTsKLQkJCX0KLQotCQkJLy8gTG9hZCBzY2FmZm9sZGluZwotCQkJaWYgKGluX2FycmF5KCdzY2FmZm9sZGluZycsICRhdXRvbG9hZFsnbGlicmFyaWVzJ10pKQotCQkJewotCQkJCSR0aGlzLT5zY2FmZm9sZGluZygpOwotCQkJCSRhdXRvbG9hZFsnbGlicmFyaWVzJ10gPSBhcnJheV9kaWZmKCRhdXRvbG9hZFsnbGlicmFyaWVzJ10sIGFycmF5KCdzY2FmZm9sZGluZycpKTsKLQkJCX0KLQkJCi0JCQkvLyBMb2FkIGFsbCBvdGhlciBsaWJyYXJpZXMKLQkJCWZvcmVhY2ggKCRhdXRvbG9hZFsnbGlicmFyaWVzJ10gYXMgJGl0ZW0pCi0JCQl7Ci0JCQkJJHRoaXMtPmxpYnJhcnkoJGl0ZW0pOwotCQkJfQotCQl9CQkKLQl9Ci0JCi0JLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotCS8qKgotCSAqIEFzc2lnbiB0byBNb2RlbHMKLQkgKgotCSAqIE1ha2VzIHN1cmUgdGhhdCBhbnl0aGluZyBsb2FkZWQgYnkgdGhlIGxvYWRlciBjbGFzcyAobGlicmFyaWVzLCBwbHVnaW5zLCBldGMuKQotCSAqIHdpbGwgYmUgYXZhaWxhYmxlIHRvIG1vZGVscywgaWYgYW55IGV4aXN0LgotCSAqCi0JICogQGFjY2Vzcwlwcml2YXRlCi0JICogQHBhcmFtCW9iamVjdAotCSAqIEByZXR1cm4JYXJyYXkKLQkgKi8KLQlmdW5jdGlvbiBfY2lfYXNzaWduX3RvX21vZGVscygpCi0JewotCQlpZiAoY291bnQoJHRoaXMtPl9jaV9tb2RlbHMpID09IDApCi0JCXsKLQkJCXJldHVybjsKLQkJfQotCQotCQlpZiAoJHRoaXMtPl9jaV9pc19pbnN0YW5jZSgpKQotCQl7Ci0JCQkkQ0kgPSYgZ2V0X2luc3RhbmNlKCk7Ci0JCQlmb3JlYWNoICgkdGhpcy0+X2NpX21vZGVscyBhcyAkbW9kZWwpCi0JCQl7CQkJCi0JCQkJJENJLT4kbW9kZWwtPl9hc3NpZ25fbGlicmFyaWVzKCk7Ci0JCQl9Ci0JCX0KLQkJZWxzZQotCQl7CQkKLQkJCWZvcmVhY2ggKCR0aGlzLT5fY2lfbW9kZWxzIGFzICRtb2RlbCkKLQkJCXsJCQkKLQkJCQkkdGhpcy0+JG1vZGVsLT5fYXNzaWduX2xpYnJhcmllcygpOwotCQkJfQotCQl9Ci0JfSAgCQotCi0JLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotCS8qKgotCSAqIE9iamVjdCB0byBBcnJheQotCSAqCi0JICogVGFrZXMgYW4gb2JqZWN0IGFzIGlucHV0IGFuZCBjb252ZXJ0cyB0aGUgY2xhc3MgdmFyaWFibGVzIHRvIGFycmF5IGtleS92YWxzCi0JICoKLQkgKiBAYWNjZXNzCXByaXZhdGUKLQkgKiBAcGFyYW0Jb2JqZWN0Ci0JICogQHJldHVybglhcnJheQotCSAqLwotCWZ1bmN0aW9uIF9jaV9vYmplY3RfdG9fYXJyYXkoJG9iamVjdCkKLQl7Ci0JCXJldHVybiAoaXNfb2JqZWN0KCRvYmplY3QpKSA/IGdldF9vYmplY3RfdmFycygkb2JqZWN0KSA6ICRvYmplY3Q7Ci0JfQotCi0JLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotCS8qKgotCSAqIERldGVybWluZXMgd2hldGhlciB3ZSBzaG91bGQgdXNlIHRoZSBDSSBpbnN0YW5jZSBvciAkdGhpcwotCSAqCi0JICogQGFjY2Vzcwlwcml2YXRlCi0JICogQHJldHVybglib29sCi0JICovCi0JZnVuY3Rpb24gX2NpX2lzX2luc3RhbmNlKCkKLQl7Ci0JCWlmICgkdGhpcy0+X2NpX2lzX3BocDUgPT0gVFJVRSkKLQkJewotCQkJcmV0dXJuIFRSVUU7Ci0JCX0KLQkKLQkJZ2xvYmFsICRDSTsKLQkJcmV0dXJuIChpc19vYmplY3QoJENJKSkgPyBUUlVFIDogRkFMU0U7Ci0JfQotCQotfQorPD9waHAgIGlmICghZGVmaW5lZCgnQkFTRVBBVEgnKSkgZXhpdCgnTm8gZGlyZWN0IHNjcmlwdCBhY2Nlc3MgYWxsb3dlZCcpOw0KKy8qKg0KKyAqIENvZGUgSWduaXRlcg0KKyAqDQorICogQW4gb3BlbiBzb3VyY2UgYXBwbGljYXRpb24gZGV2ZWxvcG1lbnQgZnJhbWV3b3JrIGZvciBQSFAgNC4zLjIgb3IgbmV3ZXINCisgKg0KKyAqIEBwYWNrYWdlCQlDb2RlSWduaXRlcg0KKyAqIEBhdXRob3IJCVJpY2sgRWxsaXMNCisgKiBAY29weXJpZ2h0CUNvcHlyaWdodCAoYykgMjAwNiwgcE1hY2hpbmUsIEluYy4NCisgKiBAbGljZW5zZQkJaHR0cDovL3d3dy5jb2RlaWduaXRvci5jb20vdXNlcl9ndWlkZS9saWNlbnNlLmh0bWwNCisgKiBAbGluawkJaHR0cDovL3d3dy5jb2RlaWduaXRlci5jb20NCisgKiBAc2luY2UJCVZlcnNpb24gMS4wDQorICogQGZpbGVzb3VyY2UNCisgKi8NCisNCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCisNCisvKioNCisgKiBMb2FkZXIgQ2xhc3MNCisgKg0KKyAqIExvYWRzIHZpZXdzIGFuZCBmaWxlcw0KKyAqDQorICogQHBhY2thZ2UJCUNvZGVJZ25pdGVyDQorICogQHN1YnBhY2thZ2UJTGlicmFyaWVzDQorICogQGF1dGhvcgkJUmljayBFbGxpcw0KKyAqIEBjYXRlZ29yeQlMb2FkZXINCisgKiBAbGluawkJaHR0cDovL3d3dy5jb2RlaWduaXRlci5jb20vdXNlcl9ndWlkZS9saWJyYXJpZXMvbG9hZGVyLmh0bWwNCisgKi8NCitjbGFzcyBDSV9Mb2FkZXIgew0KKw0KKwkvLyBBbGwgdGhlc2UgYXJlIHNldCBhdXRvbWF0aWNhbGx5LiBEb24ndCBtZXNzIHdpdGggdGhlbS4NCisJdmFyICRfY2lfb2JfbGV2ZWw7DQorCXZhciAkX2NpX3ZpZXdfcGF0aAkJPSAnJzsNCisJdmFyICRfY2lfaXNfcGhwNQkJPSBGQUxTRTsNCisJdmFyICRfY2lfaXNfaW5zdGFuY2UgCT0gRkFMU0U7IC8vIFdoZXRoZXIgd2Ugc2hvdWxkIHVzZSAkdGhpcyBvciAkQ0kgPSYgZ2V0X2luc3RhbmNlKCkNCisJdmFyICRfY2lfY2FjaGVkX3ZhcnMJPSBhcnJheSgpOw0KKwl2YXIgJF9jaV9jbGFzc2VzCQk9IGFycmF5KCk7DQorCXZhciAkX2NpX21vZGVscwkJCT0gYXJyYXkoKTsNCisJdmFyICRfY2lfaGVscGVycwkJPSBhcnJheSgpOw0KKwl2YXIgJF9jaV9wbHVnaW5zCQk9IGFycmF5KCk7DQorCXZhciAkX2NpX3NjcmlwdHMJCT0gYXJyYXkoKTsNCisJdmFyICRfY2lfdmFybWFwCQkJPSBhcnJheSgndW5pdF90ZXN0JyA9PiAndW5pdCcsICd1c2VyX2FnZW50JyA9PiAnYWdlbnQnKTsNCisJDQorDQorCS8qKg0KKwkgKiBDb25zdHJ1Y3Rvcg0KKwkgKg0KKwkgKiBTZXRzIHRoZSBwYXRoIHRvIHRoZSB2aWV3IGZpbGVzIGFuZCBnZXRzIHRoZSBpbml0aWFsIG91dHB1dCBidWZmZXJpbmcgbGV2ZWwNCisJICoNCisJICogQGFjY2VzcwlwdWJsaWMNCisJICovDQorCWZ1bmN0aW9uIENJX0xvYWRlcigpDQorCXsJDQorCQkkdGhpcy0+X2NpX2lzX3BocDUgPSAoZmxvb3IocGhwdmVyc2lvbigpKSA+PSA1KSA/IFRSVUUgOiBGQUxTRTsNCisJCSR0aGlzLT5fY2lfdmlld19wYXRoID0gQVBQUEFUSC4ndmlld3MvJzsNCisJCSR0aGlzLT5fY2lfb2JfbGV2ZWwgID0gb2JfZ2V0X2xldmVsKCk7DQorCQkJCQ0KKwkJbG9nX21lc3NhZ2UoJ2RlYnVnJywgIkxvYWRlciBDbGFzcyBJbml0aWFsaXplZCIpOw0KKwl9DQorCQ0KKwkvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KKwkNCisJLyoqDQorCSAqIENsYXNzIExvYWRlcg0KKwkgKg0KKwkgKiBUaGlzIGZ1bmN0aW9uIGxldHMgdXNlcnMgbG9hZCBhbmQgaW5zdGFudGlhdGUgY2xhc3Nlcy4NCisJICogSXQgaXMgZGVzaWduZWQgdG8gYmUgY2FsbGVkIGZyb20gYSB1c2VyJ3MgYXBwIGNvbnRyb2xsZXJzLg0KKwkgKg0KKwkgKiBAYWNjZXNzCXB1YmxpYw0KKwkgKiBAcGFyYW0Jc3RyaW5nCXRoZSBuYW1lIG9mIHRoZSBjbGFzcw0KKwkgKiBAcGFyYW0JbWl4ZWQJdGhlIG9wdGlvbmFsIHBhcmFtZXRlcnMNCisJICogQHJldHVybgl2b2lkDQorCSAqLwkNCisJZnVuY3Rpb24gbGlicmFyeSgkbGlicmFyeSA9ICcnLCAkcGFyYW1zID0gTlVMTCkNCisJewkJDQorCQlpZiAoJGxpYnJhcnkgPT0gJycpDQorCQl7DQorCQkJcmV0dXJuIEZBTFNFOw0KKwkJfQ0KKw0KKwkJaWYgKGlzX2FycmF5KCRsaWJyYXJ5KSkNCisJCXsNCisJCQlmb3JlYWNoICgkbGlicmFyeSBhcyAkY2xhc3MpDQorCQkJew0KKwkJCQkkdGhpcy0+X2NpX2xvYWRfY2xhc3MoJGNsYXNzLCAkcGFyYW1zKTsNCisJCQl9DQorCQl9DQorCQllbHNlDQorCQl7DQorCQkJJHRoaXMtPl9jaV9sb2FkX2NsYXNzKCRsaWJyYXJ5LCAkcGFyYW1zKTsNCisJCX0NCisJCQ0KKwkJJHRoaXMtPl9jaV9hc3NpZ25fdG9fbW9kZWxzKCk7DQorCX0NCisNCisJLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCisJDQorCS8qKg0KKwkgKiBNb2RlbCBMb2FkZXINCisJICoNCisJICogVGhpcyBmdW5jdGlvbiBsZXRzIHVzZXJzIGxvYWQgYW5kIGluc3RhbnRpYXRlIG1vZGVscy4NCisJICoNCisJICogQGFjY2VzcwlwdWJsaWMNCisJICogQHBhcmFtCXN0cmluZwl0aGUgbmFtZSBvZiB0aGUgY2xhc3MNCisJICogQHBhcmFtCW1peGVkCWFueSBpbml0aWFsaXphdGlvbiBwYXJhbWV0ZXJzDQorCSAqIEByZXR1cm4Jdm9pZA0KKwkgKi8JDQorCWZ1bmN0aW9uIG1vZGVsKCRtb2RlbCwgJG5hbWUgPSAnJywgJGRiX2Nvbm4gPSBGQUxTRSkNCisJewkJDQorCQlpZiAoJG1vZGVsID09ICcnKQ0KKwkJCXJldHVybjsNCisJDQorCQkvLyBJcyB0aGUgbW9kZWwgaW4gYSBzdWItZm9sZGVyPyBJZiBzbywgcGFyc2Ugb3V0IHRoZSBmaWxlbmFtZSBhbmQgcGF0aC4NCisJCWlmIChzdHJwb3MoJG1vZGVsLCAnLycpID09PSBGQUxTRSkNCisJCXsNCisJCQkkcGF0aCA9ICcnOw0KKwkJfQ0KKwkJZWxzZQ0KKwkJew0KKwkJCSR4ID0gZXhwbG9kZSgnLycsICRtb2RlbCk7DQorCQkJJG1vZGVsID0gZW5kKCR4KTsJCQkNCisJCQl1bnNldCgkeFtjb3VudCgkeCktMV0pOw0KKwkJCSRwYXRoID0gaW1wbG9kZSgnLycsICR4KS4nLyc7DQorCQl9DQorCQ0KKwkJaWYgKCRuYW1lID09ICcnKQ0KKwkJew0KKwkJCSRuYW1lID0gJG1vZGVsOw0KKwkJfQ0KKwkJDQorCQlpZiAoaW5fYXJyYXkoJG5hbWUsICR0aGlzLT5fY2lfbW9kZWxzLCBUUlVFKSkNCisJCXsNCisJCQlyZXR1cm47DQorCQl9DQorCQkNCisJCSRDSSA9JiBnZXRfaW5zdGFuY2UoKTsNCisJCWlmIChpc3NldCgkQ0ktPiRuYW1lKSkNCisJCXsNCisJCQlzaG93X2Vycm9yKCdUaGUgbW9kZWwgbmFtZSB5b3UgYXJlIGxvYWRpbmcgaXMgdGhlIG5hbWUgb2YgYSByZXNvdXJjZSB0aGF0IGlzIGFscmVhZHkgYmVpbmcgdXNlZDogJy4kbmFtZSk7DQorCQl9DQorCQ0KKwkJJG1vZGVsID0gc3RydG9sb3dlcigkbW9kZWwpOw0KKwkJDQorCQlpZiAoICEgZmlsZV9leGlzdHMoQVBQUEFUSC4nbW9kZWxzLycuJHBhdGguJG1vZGVsLkVYVCkpDQorCQl7DQorCQkJc2hvd19lcnJvcignVW5hYmxlIHRvIGxvY2F0ZSB0aGUgbW9kZWwgeW91IGhhdmUgc3BlY2lmaWVkOiAnLiRtb2RlbCk7DQorCQl9DQorCQkJCQ0KKwkJaWYgKCRkYl9jb25uICE9PSBGQUxTRSBBTkQgISBjbGFzc19leGlzdHMoJ0NJX0RCJykpDQorCQl7DQorCQkJaWYgKCRkYl9jb25uID09PSBUUlVFKQ0KKwkJCQkkZGJfY29ubiA9ICcnOw0KKwkJDQorCQkJJENJLT5sb2FkLT5kYXRhYmFzZSgkZGJfY29ubiwgRkFMU0UsIFRSVUUpOw0KKwkJfQ0KKwkNCisJCWlmICggISBjbGFzc19leGlzdHMoJ01vZGVsJykpDQorCQl7DQorCQkJcmVxdWlyZV9vbmNlKEJBU0VQQVRILidsaWJyYXJpZXMvTW9kZWwnLkVYVCk7DQorCQl9DQorDQorCQlyZXF1aXJlX29uY2UoQVBQUEFUSC4nbW9kZWxzLycuJHBhdGguJG1vZGVsLkVYVCk7DQorDQorCQkkbW9kZWwgPSB1Y2ZpcnN0KCRtb2RlbCk7DQorCQkJCQ0KKwkJJENJLT4kbmFtZSA9IG5ldyAkbW9kZWwoKTsNCisJCSRDSS0+JG5hbWUtPl9hc3NpZ25fbGlicmFyaWVzKCk7DQorCQkNCisJCSR0aGlzLT5fY2lfbW9kZWxzW10gPSAkbmFtZTsJDQorCX0NCisJCQ0KKwkvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KKwkNCisJLyoqDQorCSAqIERhdGFiYXNlIExvYWRlcg0KKwkgKg0KKwkgKiBAYWNjZXNzCXB1YmxpYw0KKwkgKiBAcGFyYW0Jc3RyaW5nCXRoZSBEQiBjcmVkZW50aWFscw0KKwkgKiBAcGFyYW0JYm9vbAl3aGV0aGVyIHRvIHJldHVybiB0aGUgREIgb2JqZWN0DQorCSAqIEBwYXJhbQlib29sCXdoZXRoZXIgdG8gZW5hYmxlIGFjdGl2ZSByZWNvcmQgKHRoaXMgYWxsb3dzIHVzIHRvIG92ZXJyaWRlIHRoZSBjb25maWcgc2V0dGluZykNCisJICogQHJldHVybglvYmplY3QNCisJICovCQ0KKwlmdW5jdGlvbiBkYXRhYmFzZSgkcGFyYW1zID0gJycsICRyZXR1cm4gPSBGQUxTRSwgJGFjdGl2ZV9yZWNvcmQgPSBGQUxTRSkNCisJew0KKwkJLy8gRG8gd2UgZXZlbiBuZWVkIHRvIGxvYWQgdGhlIGRhdGFiYXNlIGNsYXNzPw0KKwkJaWYgKGNsYXNzX2V4aXN0cygnQ0lfREInKSBBTkQgJHJldHVybiA9PSBGQUxTRSBBTkQgJGFjdGl2ZV9yZWNvcmQgPT0gRkFMU0UpDQorCQl7DQorCQkJcmV0dXJuIEZBTFNFOw0KKwkJfQkNCisJDQorCQlyZXF1aXJlX29uY2UoQkFTRVBBVEguJ2RhdGFiYXNlL0RCJy5FWFQpOw0KKw0KKwkJaWYgKCRyZXR1cm4gPT09IFRSVUUpDQorCQl7DQorCQkJcmV0dXJuIERCKCRwYXJhbXMsICRhY3RpdmVfcmVjb3JkKTsNCisJCX0NCisNCisJCS8vIEdyYWIgdGhlIHN1cGVyIG9iamVjdA0KKwkJJENJID0mIGdldF9pbnN0YW5jZSgpOw0KKwkJDQorCQkvLyBJbml0aWFsaXplIHRoZSBkYiB2YXJpYWJsZS4gIE5lZWRlZCB0byBwcmV2ZW50ICAgDQorCQkvLyByZWZlcmVuY2UgZXJyb3JzIHdpdGggc29tZSBjb25maWd1cmF0aW9ucw0KKwkJJENJLT5kYiA9ICcnOw0KKwkJDQorCQkvLyBMb2FkIHRoZSBEQiBjbGFzcw0KKwkJJENJLT5kYiA9JiBEQigkcGFyYW1zLCAkYWN0aXZlX3JlY29yZCk7CQ0KKwkJDQorCQkvLyBBc3NpZ24gdGhlIERCIG9iamVjdCB0byBhbnkgZXhpc3RpbmcgbW9kZWxzDQorCQkkdGhpcy0+X2NpX2Fzc2lnbl90b19tb2RlbHMoKTsNCisJfQ0KKwkNCisJLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCisNCisJLyoqDQorCSAqIExvYWQgdGhlIFV0aWxpdGllcyBDbGFzcw0KKwkgKg0KKwkgKiBAYWNjZXNzCXB1YmxpYw0KKwkgKiBAcmV0dXJuCXN0cmluZwkJDQorCSAqLwkJDQorCWZ1bmN0aW9uIGRidXRpbCgpDQorCXsNCisJCWlmICggISBjbGFzc19leGlzdHMoJ0NJX0RCJykpDQorCQl7DQorCQkJJHRoaXMtPmRhdGFiYXNlKCk7DQorCQl9DQorCQkNCisJCSRDSSA9JiBnZXRfaW5zdGFuY2UoKTsNCisJDQorCQlyZXF1aXJlX29uY2UoQkFTRVBBVEguJ2RhdGFiYXNlL0RCX3V0aWxpdHknLkVYVCk7DQorCQlyZXF1aXJlX29uY2UoQkFTRVBBVEguJ2RhdGFiYXNlL2RyaXZlcnMvJy4kQ0ktPmRiLT5kYmRyaXZlci4nLycuJENJLT5kYi0+ZGJkcml2ZXIuJ191dGlsaXR5Jy5FWFQpOw0KKwkJJGNsYXNzID0gJ0NJX0RCXycuJENJLT5kYi0+ZGJkcml2ZXIuJ191dGlsaXR5JzsNCisNCisJCSRDSS0+ZGJ1dGlsID0gbmV3ICRjbGFzcygpOw0KKwkJJENJLT5sb2FkLT5fY2lfYXNzaWduX3RvX21vZGVscygpOw0KKwl9DQorCQ0KKwkvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KKwkNCisJLyoqDQorCSAqIExvYWQgVmlldw0KKwkgKg0KKwkgKiBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgdG8gbG9hZCBhICJ2aWV3IiBmaWxlLiAgSXQgaGFzIHRocmVlIHBhcmFtZXRlcnM6DQorCSAqDQorCSAqIDEuIFRoZSBuYW1lIG9mIHRoZSAidmlldyIgZmlsZSB0byBiZSBpbmNsdWRlZC4NCisJICogMi4gQW4gYXNzb2NpYXRpdmUgYXJyYXkgb2YgZGF0YSB0byBiZSBleHRyYWN0ZWQgZm9yIHVzZSBpbiB0aGUgdmlldy4NCisJICogMy4gVFJVRS9GQUxTRSAtIHdoZXRoZXIgdG8gcmV0dXJuIHRoZSBkYXRhIG9yIGxvYWQgaXQuICBJbg0KKwkgKiBzb21lIGNhc2VzIGl0J3MgYWR2YW50YWdlb3VzIHRvIGJlIGFibGUgdG8gcmV0dXJuIGRhdGEgc28gdGhhdA0KKwkgKiBhIGRldmVsb3BlciBjYW4gcHJvY2VzcyBpdCBpbiBzb21lIHdheS4NCisJICoNCisJICogQGFjY2VzcwlwdWJsaWMNCisJICogQHBhcmFtCXN0cmluZw0KKwkgKiBAcGFyYW0JYXJyYXkNCisJICogQHBhcmFtCWJvb2wNCisJICogQHJldHVybgl2b2lkDQorCSAqLw0KKwlmdW5jdGlvbiB2aWV3KCR2aWV3LCAkdmFycyA9IGFycmF5KCksICRyZXR1cm4gPSBGQUxTRSkNCisJew0KKwkJcmV0dXJuICR0aGlzLT5fY2lfbG9hZChhcnJheSgndmlldycgPT4gJHZpZXcsICd2YXJzJyA9PiAkdGhpcy0+X2NpX29iamVjdF90b19hcnJheSgkdmFycyksICdyZXR1cm4nID0+ICRyZXR1cm4pKTsNCisJfQ0KKwkNCisJLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCisJDQorCS8qKg0KKwkgKiBMb2FkIEZpbGUNCisJICoNCisJICogVGhpcyBpcyBhIGdlbmVyaWMgZmlsZSBsb2FkZXINCisJICoNCisJICogQGFjY2VzcwlwdWJsaWMNCisJICogQHBhcmFtCXN0cmluZw0KKwkgKiBAcGFyYW0JYm9vbA0KKwkgKiBAcmV0dXJuCXN0cmluZw0KKwkgKi8NCisJZnVuY3Rpb24gZmlsZSgkcGF0aCwgJHJldHVybiA9IEZBTFNFKQ0KKwl7DQorCQlyZXR1cm4gJHRoaXMtPl9jaV9sb2FkKGFycmF5KCdwYXRoJyA9PiAkcGF0aCwgJ3JldHVybicgPT4gJHJldHVybikpOw0KKwl9DQorCQ0KKwkvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KKwkNCisJLyoqDQorCSAqIFNldCBWYXJpYWJsZXMNCisJICoNCisJICogT25jZSB2YXJpYWJsZXMgYXJlIHNldCB0aGV5IGJlY29tZSBhdmFpbGFibGUgd2l0aGluDQorCSAqIHRoZSBjb250cm9sbGVyIGNsYXNzIGFuZCBpdHMgInZpZXciIGZpbGVzLg0KKwkgKg0KKwkgKiBAYWNjZXNzCXB1YmxpYw0KKwkgKiBAcGFyYW0JYXJyYXkNCisJICogQHJldHVybgl2b2lkDQorCSAqLw0KKwlmdW5jdGlvbiB2YXJzKCR2YXJzID0gYXJyYXkoKSkNCisJew0KKwkJJHZhcnMgPSAkdGhpcy0+X2NpX29iamVjdF90b19hcnJheSgkdmFycyk7DQorCQ0KKwkJaWYgKGlzX2FycmF5KCR2YXJzKSBBTkQgY291bnQoJHZhcnMpID4gMCkNCisJCXsNCisJCQlmb3JlYWNoICgkdmFycyBhcyAka2V5ID0+ICR2YWwpDQorCQkJew0KKwkJCQkkdGhpcy0+X2NpX2NhY2hlZF92YXJzWyRrZXldID0gJHZhbDsNCisJCQl9DQorCQl9DQorCX0NCisJDQorCS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQorCQ0KKwkvKioNCisJICogTG9hZCBIZWxwZXINCisJICoNCisJICogVGhpcyBmdW5jdGlvbiBsb2FkcyB0aGUgc3BlY2lmaWVkIGhlbHBlciBmaWxlLg0KKwkgKg0KKwkgKiBAYWNjZXNzCXB1YmxpYw0KKwkgKiBAcGFyYW0JbWl4ZWQNCisJICogQHJldHVybgl2b2lkDQorCSAqLw0KKwlmdW5jdGlvbiBoZWxwZXIoJGhlbHBlcnMgPSBhcnJheSgpKQ0KKwl7DQorCQlpZiAoICEgaXNfYXJyYXkoJGhlbHBlcnMpKQ0KKwkJew0KKwkJCSRoZWxwZXJzID0gYXJyYXkoJGhlbHBlcnMpOw0KKwkJfQ0KKwkNCisJCWZvcmVhY2ggKCRoZWxwZXJzIGFzICRoZWxwZXIpDQorCQl7CQkNCisJCQkkaGVscGVyID0gc3RydG9sb3dlcihzdHJfcmVwbGFjZShFWFQsICcnLCBzdHJfcmVwbGFjZSgnX2hlbHBlcicsICcnLCAkaGVscGVyKSkuJ19oZWxwZXInKTsNCisJCQ0KKwkJCWlmIChpc3NldCgkdGhpcy0+X2NpX2hlbHBlcnNbJGhlbHBlcl0pKQ0KKwkJCXsNCisJCQkJY29udGludWU7DQorCQkJfQ0KKw0KKwkJCWlmIChmaWxlX2V4aXN0cyhBUFBQQVRILidoZWxwZXJzLycuJGhlbHBlci5FWFQpKQ0KKwkJCXsgDQorCQkJCWluY2x1ZGVfb25jZShBUFBQQVRILidoZWxwZXJzLycuJGhlbHBlci5FWFQpOw0KKwkJCX0NCisJCQllbHNlDQorCQkJewkJDQorCQkJCWlmIChmaWxlX2V4aXN0cyhCQVNFUEFUSC4naGVscGVycy8nLiRoZWxwZXIuRVhUKSkNCisJCQkJew0KKwkJCQkJaW5jbHVkZShCQVNFUEFUSC4naGVscGVycy8nLiRoZWxwZXIuRVhUKTsNCisJCQkJfQ0KKwkJCQllbHNlDQorCQkJCXsNCisJCQkJCXNob3dfZXJyb3IoJ1VuYWJsZSB0byBsb2FkIHRoZSByZXF1ZXN0ZWQgZmlsZTogaGVscGVycy8nLiRoZWxwZXIuRVhUKTsNCisJCQkJfQ0KKwkJCX0NCisNCisJCQkkdGhpcy0+X2NpX2hlbHBlcnNbJGhlbHBlcl0gPSBUUlVFOw0KKwkJCQ0KKwkJfQ0KKwkJDQorCQlsb2dfbWVzc2FnZSgnZGVidWcnLCAnSGVscGVycyBsb2FkZWQ6ICcuaW1wbG9kZSgnLCAnLCAkaGVscGVycykpOw0KKwl9DQorCQ0KKwkvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KKwkNCisJLyoqDQorCSAqIExvYWQgSGVscGVycw0KKwkgKg0KKwkgKiBUaGlzIGlzIHNpbXBseSBhbiBhbGlhcyB0byB0aGUgYWJvdmUgZnVuY3Rpb24gaW4gY2FzZSB0aGUNCisJICogdXNlciBoYXMgd3JpdHRlbiB0aGUgcGx1cmFsIGZvcm0gb2YgdGhpcyBmdW5jdGlvbi4NCisJICoNCisJICogQGFjY2VzcwlwdWJsaWMNCisJICogQHBhcmFtCWFycmF5DQorCSAqIEByZXR1cm4Jdm9pZA0KKwkgKi8NCisJZnVuY3Rpb24gaGVscGVycygkaGVscGVycyA9IGFycmF5KCkpDQorCXsNCisJCSR0aGlzLT5oZWxwZXIoJGhlbHBlcnMpOw0KKwl9DQorCQ0KKwkvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KKwkNCisJLyoqDQorCSAqIExvYWQgUGx1Z2luDQorCSAqDQorCSAqIFRoaXMgZnVuY3Rpb24gbG9hZHMgdGhlIHNwZWNpZmllZCBwbHVnaW4uDQorCSAqDQorCSAqIEBhY2Nlc3MJcHVibGljDQorCSAqIEBwYXJhbQlhcnJheQ0KKwkgKiBAcmV0dXJuCXZvaWQNCisJICovDQorCWZ1bmN0aW9uIHBsdWdpbigkcGx1Z2lucyA9IGFycmF5KCkpDQorCXsNCisJCWlmICggISBpc19hcnJheSgkcGx1Z2lucykpDQorCQl7DQorCQkJJHBsdWdpbnMgPSBhcnJheSgkcGx1Z2lucyk7DQorCQl9DQorCQ0KKwkJZm9yZWFjaCAoJHBsdWdpbnMgYXMgJHBsdWdpbikNCisJCXsJDQorCQkJJHBsdWdpbiA9IHN0cnRvbG93ZXIoc3RyX3JlcGxhY2UoRVhULCAnJywgc3RyX3JlcGxhY2UoJ19wbHVnaW4uJywgJycsICRwbHVnaW4pKS4nX3BpJyk7CQkNCisNCisJCQlpZiAoaXNzZXQoJHRoaXMtPl9jaV9wbHVnaW5zWyRwbHVnaW5dKSkNCisJCQl7DQorCQkJCWNvbnRpbnVlOw0KKwkJCX0NCisNCisJCQlpZiAoZmlsZV9leGlzdHMoQVBQUEFUSC4ncGx1Z2lucy8nLiRwbHVnaW4uRVhUKSkNCisJCQl7DQorCQkJCWluY2x1ZGUoQVBQUEFUSC4ncGx1Z2lucy8nLiRwbHVnaW4uRVhUKTsJDQorCQkJfQ0KKwkJCWVsc2UNCisJCQl7DQorCQkJCWlmIChmaWxlX2V4aXN0cyhCQVNFUEFUSC4ncGx1Z2lucy8nLiRwbHVnaW4uRVhUKSkNCisJCQkJew0KKwkJCQkJaW5jbHVkZShCQVNFUEFUSC4ncGx1Z2lucy8nLiRwbHVnaW4uRVhUKTsJDQorCQkJCX0NCisJCQkJZWxzZQ0KKwkJCQl7DQorCQkJCQlzaG93X2Vycm9yKCdVbmFibGUgdG8gbG9hZCB0aGUgcmVxdWVzdGVkIGZpbGU6IHBsdWdpbnMvJy4kcGx1Z2luLkVYVCk7DQorCQkJCX0NCisJCQl9DQorCQkJDQorCQkJJHRoaXMtPl9jaV9wbHVnaW5zWyRwbHVnaW5dID0gVFJVRTsNCisJCX0NCisJCQ0KKwkJbG9nX21lc3NhZ2UoJ2RlYnVnJywgJ1BsdWdpbnMgbG9hZGVkOiAnLmltcGxvZGUoJywgJywgJHBsdWdpbnMpKTsNCisJfQ0KKw0KKwkvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KKwkNCisJLyoqDQorCSAqIExvYWQgUGx1Z2lucw0KKwkgKg0KKwkgKiBUaGlzIGlzIHNpbXBseSBhbiBhbGlhcyB0byB0aGUgYWJvdmUgZnVuY3Rpb24gaW4gY2FzZSB0aGUNCisJICogdXNlciBoYXMgd3JpdHRlbiB0aGUgcGx1cmFsIGZvcm0gb2YgdGhpcyBmdW5jdGlvbi4NCisJICoNCisJICogQGFjY2VzcwlwdWJsaWMNCisJICogQHBhcmFtCWFycmF5DQorCSAqIEByZXR1cm4Jdm9pZA0KKwkgKi8NCisJZnVuY3Rpb24gcGx1Z2lucygkcGx1Z2lucyA9IGFycmF5KCkpDQorCXsNCisJCSR0aGlzLT5wbHVnaW4oJHBsdWdpbnMpOw0KKwl9DQorDQorCS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQorCQ0KKwkvKioNCisJICogTG9hZCBTY3JpcHQNCisJICoNCisJICogVGhpcyBmdW5jdGlvbiBsb2FkcyB0aGUgc3BlY2lmaWVkIGluY2x1ZGUgZmlsZSBmcm9tIHRoZQ0KKwkgKiBhcHBsaWNhdGlvbi9zY3JpcHRzLyBmb2xkZXIuDQorCSAqDQorCSAqIE5PVEU6ICBUaGlzIGZlYXR1cmUgaGFzIGJlZW4gZGVwcmVjYXRlZCBidXQgaXQgd2lsbCByZW1haW4gYXZhaWxhYmxlDQorCSAqIGZvciBsZWdhY3kgdXNlcnMuDQorCSAqDQorCSAqIEBhY2Nlc3MJcHVibGljDQorCSAqIEBwYXJhbQlhcnJheQ0KKwkgKiBAcmV0dXJuCXZvaWQNCisJICovDQorCWZ1bmN0aW9uIHNjcmlwdCgkc2NyaXB0cyA9IGFycmF5KCkpDQorCXsNCisJCWlmICggISBpc19hcnJheSgkc2NyaXB0cykpDQorCQl7DQorCQkJJHNjcmlwdHMgPSBhcnJheSgkc2NyaXB0cyk7DQorCQl9DQorCQ0KKwkJZm9yZWFjaCAoJHNjcmlwdHMgYXMgJHNjcmlwdCkNCisJCXsJDQorCQkJJHNjcmlwdCA9IHN0cnRvbG93ZXIoc3RyX3JlcGxhY2UoRVhULCAnJywgJHNjcmlwdCkpOw0KKw0KKwkJCWlmIChpc3NldCgkdGhpcy0+X2NpX3NjcmlwdHNbJHNjcmlwdF0pKQ0KKwkJCXsNCisJCQkJY29udGludWU7DQorCQkJfQ0KKwkJDQorCQkJaWYgKCAhIGZpbGVfZXhpc3RzKEFQUFBBVEguJ3NjcmlwdHMvJy4kc2NyaXB0LkVYVCkpDQorCQkJew0KKwkJCQlzaG93X2Vycm9yKCdVbmFibGUgdG8gbG9hZCB0aGUgcmVxdWVzdGVkIHNjcmlwdDogc2NyaXB0cy8nLiRzY3JpcHQuRVhUKTsNCisJCQl9DQorCQkJDQorCQkJaW5jbHVkZShBUFBQQVRILidzY3JpcHRzLycuJHNjcmlwdC5FWFQpOw0KKwkJfQ0KKwkJDQorCQlsb2dfbWVzc2FnZSgnZGVidWcnLCAnU2NyaXB0cyBsb2FkZWQ6ICcuaW1wbG9kZSgnLCAnLCAkc2NyaXB0cykpOw0KKwl9DQorCQkNCisJLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCisJDQorCS8qKg0KKwkgKiBMb2FkcyBhIGxhbmd1YWdlIGZpbGUNCisJICoNCisJICogQGFjY2VzcwlwdWJsaWMNCisJICogQHBhcmFtCXN0cmluZw0KKwkgKiBAcmV0dXJuCXZvaWQNCisJICovDQorCWZ1bmN0aW9uIGxhbmd1YWdlKCRmaWxlID0gJycsICRsYW5nID0gJycsICRyZXR1cm4gPSBGQUxTRSkNCisJew0KKwkJJENJID0mIGdldF9pbnN0YW5jZSgpOw0KKwkJcmV0dXJuICRDSS0+bGFuZy0+bG9hZCgkZmlsZSwgJGxhbmcsICRyZXR1cm4pOw0KKwl9DQorCQ0KKwkvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KKwkNCisJLyoqDQorCSAqIExvYWRzIGEgY29uZmlnIGZpbGUNCisJICoNCisJICogQGFjY2VzcwlwdWJsaWMNCisJICogQHBhcmFtCXN0cmluZw0KKwkgKiBAcmV0dXJuCXZvaWQNCisJICovDQorCWZ1bmN0aW9uIGNvbmZpZygkZmlsZSA9ICcnLCAkdXNlX3NlY3Rpb25zID0gRkFMU0UsICRmYWlsX2dyYWNlZnVsbHkgPSBGQUxTRSkNCisJewkJCQ0KKwkJJENJID0mIGdldF9pbnN0YW5jZSgpOw0KKwkJJENJLT5jb25maWctPmxvYWQoJGZpbGUsICR1c2Vfc2VjdGlvbnMsICRmYWlsX2dyYWNlZnVsbHkpOw0KKwl9DQorDQorCS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQorCQ0KKwkvKioNCisJICogU2NhZmZvbGRpbmcgTG9hZGVyDQorCSAqDQorCSAqIFRoaXMgaW5pdGlhbGl6aW5nIGZ1bmN0aW9uIHdvcmtzIGEgYml0IGRpZmZlcmVudCB0aGFuIHRoZQ0KKwkgKiBvdGhlcnMuIEl0IGRvZXNuJ3QgbG9hZCB0aGUgY2xhc3MuICBJbnN0ZWFkLCBpdCBzaW1wbHkNCisJICogc2V0cyBhIGZsYWcgaW5kaWNhdGluZyB0aGF0IHNjYWZmb2xkaW5nIGlzIGFsbG93ZWQgdG8gYmUNCisJICogdXNlZC4gIFRoZSBhY3R1YWwgc2NhZmZvbGRpbmcgZnVuY3Rpb24gYmVsb3cgaXMNCisJICogY2FsbGVkIGJ5IHRoZSBmcm9udCBjb250cm9sbGVyIGJhc2VkIG9uIHdoZXRoZXIgdGhlDQorCSAqIHNlY29uZCBzZWdtZW50IG9mIHRoZSBVUkwgbWF0Y2hlcyB0aGUgInNlY3JldCIgc2NhZmZvbGRpbmcNCisJICogd29yZCBzdG9yZWQgaW4gdGhlIGFwcGxpY2F0aW9uL2NvbmZpZy9yb3V0ZXMucGhwDQorCSAqDQorCSAqIEBhY2Nlc3MJcHVibGljDQorCSAqIEBwYXJhbQlzdHJpbmcNCisJICogQHJldHVybgl2b2lkDQorCSAqLwkNCisJZnVuY3Rpb24gc2NhZmZvbGRpbmcoJHRhYmxlID0gJycpDQorCXsJCQ0KKwkJaWYgKCR0YWJsZSA9PT0gRkFMU0UpDQorCQl7DQorCQkJc2hvd19lcnJvcignWW91IG11c3QgaW5jbHVkZSB0aGUgbmFtZSBvZiB0aGUgdGFibGUgeW91IHdvdWxkIGxpa2UgYWNjZXNzIHdoZW4geW91IGluaXRpYWxpemUgc2NhZmZvbGRpbmcnKTsNCisJCX0NCisJCQ0KKwkJJENJID0mIGdldF9pbnN0YW5jZSgpOw0KKwkJJENJLT5fY2lfc2NhZmZvbGRpbmcgPSBUUlVFOw0KKwkJJENJLT5fY2lfc2NhZmZfdGFibGUgPSAkdGFibGU7DQorCX0NCisNCisJLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCisJCQ0KKwkvKioNCisJICogTG9hZGVyDQorCSAqDQorCSAqIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCB0byBsb2FkIHZpZXdzIGFuZCBmaWxlcy4NCisJICoNCisJICogQGFjY2Vzcwlwcml2YXRlDQorCSAqIEBwYXJhbQlhcnJheQ0KKwkgKiBAcmV0dXJuCXZvaWQNCisJICovDQorCWZ1bmN0aW9uIF9jaV9sb2FkKCRkYXRhKQ0KKwl7DQorCQkvLyBTZXQgdGhlIGRlZmF1bHQgZGF0YSB2YXJpYWJsZXMNCisJCWZvcmVhY2ggKGFycmF5KCd2aWV3JywgJ3ZhcnMnLCAncGF0aCcsICdyZXR1cm4nKSBhcyAkdmFsKQ0KKwkJew0KKwkJCSQkdmFsID0gKCAhIGlzc2V0KCRkYXRhWyR2YWxdKSkgPyBGQUxTRSA6ICRkYXRhWyR2YWxdOw0KKwkJfQ0KKw0KKwkJLy8gU2V0IHRoZSBwYXRoIHRvIHRoZSByZXF1ZXN0ZWQgZmlsZQ0KKwkJaWYgKCRwYXRoID09ICcnKQ0KKwkJew0KKwkJCSRleHQgPSBwYXRoaW5mbygkdmlldywgUEFUSElORk9fRVhURU5TSU9OKTsNCisJCQkkZmlsZSA9ICgkZXh0ID09ICcnKSA/ICR2aWV3LkVYVCA6ICR2aWV3Ow0KKwkJCSRwYXRoID0gJHRoaXMtPl9jaV92aWV3X3BhdGguJGZpbGU7DQorCQl9DQorCQllbHNlDQorCQl7DQorCQkJJHggPSBleHBsb2RlKCcvJywgJHBhdGgpOw0KKwkJCSRmaWxlID0gZW5kKCR4KTsNCisJCX0NCisJCQ0KKwkJaWYgKCAhIGZpbGVfZXhpc3RzKCRwYXRoKSkNCisJCXsNCisJCQlzaG93X2Vycm9yKCdVbmFibGUgdG8gbG9hZCB0aGUgcmVxdWVzdGVkIGZpbGU6ICcuJGZpbGUpOw0KKwkJfQ0KKwkNCisJCS8vIFRoaXMgYWxsb3dzIGFueXRoaW5nIGxvYWRlZCB1c2luZyAkdGhpcy0+bG9hZCAodmlld3MsIGZpbGVzLCBldGMuKQ0KKwkJLy8gdG8gYmVjb21lIGFjY2Vzc2libGUgZnJvbSB3aXRoaW4gdGhlIENvbnRyb2xsZXIgYW5kIE1vZGVsIGZ1bmN0aW9ucy4NCisJCS8vIE9ubHkgbmVlZGVkIHdoZW4gcnVubmluZyBQSFAgNQ0KKwkJDQorCQlpZiAoJHRoaXMtPl9jaV9pc19pbnN0YW5jZSgpKQ0KKwkJew0KKwkJCSRDSSA9JiBnZXRfaW5zdGFuY2UoKTsNCisJCQlmb3JlYWNoIChnZXRfb2JqZWN0X3ZhcnMoJENJKSBhcyAka2V5ID0+ICR2YXIpDQorCQkJew0KKwkJCQlpZiAoICEgaXNzZXQoJHRoaXMtPiRrZXkpKQ0KKwkJCQl7DQorCQkJCQkkdGhpcy0+JGtleSA9JiAkQ0ktPiRrZXk7DQorCQkJCX0NCisJCQl9DQorCQl9DQorCQkNCisJCS8qDQorCQkgKiBFeHRyYWN0IGFuZCBjYWNoZSB2YXJpYWJsZXMNCisJCSAqDQorCQkgKiBZb3UgY2FuIGVpdGhlciBzZXQgdmFyaWFibGVzIHVzaW5nIHRoZSBkZWRpY2F0ZWQgJHRoaXMtPmxvYWRfdmFycygpDQorCQkgKiBmdW5jdGlvbiBvciB2aWEgdGhlIHNlY29uZCBwYXJhbWV0ZXIgb2YgdGhpcyBmdW5jdGlvbi4gV2UnbGwgbWVyZ2UNCisJCSAqIHRoZSB0d28gdHlwZXMgYW5kIGNhY2hlIHRoZW0gc28gdGhhdCB2aWV3cyB0aGF0IGFyZSBlbWJlZGRlZCB3aXRoaW4NCisJCSAqIG90aGVyIHZpZXdzIGNhbiBoYXZlIGFjY2VzcyB0byB0aGVzZSB2YXJpYWJsZXMuDQorCQkgKi8JDQorCQlpZiAoaXNfYXJyYXkoJHZhcnMpKQ0KKwkJew0KKwkJCSR0aGlzLT5fY2lfY2FjaGVkX3ZhcnMgPSBhcnJheV9tZXJnZSgkdGhpcy0+X2NpX2NhY2hlZF92YXJzLCAkdmFycyk7DQorCQl9DQorCQlleHRyYWN0KCR0aGlzLT5fY2lfY2FjaGVkX3ZhcnMpOw0KKwkJCQkNCisJCS8qDQorCQkgKiBCdWZmZXIgdGhlIG91dHB1dA0KKwkJICoNCisJCSAqIFdlIGJ1ZmZlciB0aGUgb3V0cHV0IGZvciB0d28gcmVhc29uczoNCisJCSAqIDEuIFNwZWVkLiBZb3UgZ2V0IGEgc2lnbmlmaWNhbnQgc3BlZWQgYm9vc3QuDQorCQkgKiAyLiBTbyB0aGF0IHRoZSBmaW5hbCByZW5kZXJlZCB0ZW1wbGF0ZSBjYW4gYmUNCisJCSAqIHBvc3QtcHJvY2Vzc2VkIGJ5IHRoZSBvdXRwdXQgY2xhc3MuICBXaHkgZG8gd2UNCisJCSAqIG5lZWQgcG9zdCBwcm9jZXNzaW5nPyAgRm9yIG9uZSB0aGluZywgaW4gb3JkZXIgdG8NCisJCSAqIHNob3cgdGhlIGVsYXBzZWQgcGFnZSBsb2FkIHRpbWUuICBVbmxlc3Mgd2UNCisJCSAqIGNhbiBpbnRlcmNlcHQgdGhlIGNvbnRlbnQgcmlnaHQgYmVmb3JlIGl0J3Mgc2VudCB0bw0KKwkJICogdGhlIGJyb3dzZXIgYW5kIHRoZW4gc3RvcCB0aGUgdGltZXIgaXQgd29uJ3QgYmUgYWNjdXJhdGUuDQorCQkgKi8NCisJCW9iX3N0YXJ0KCk7DQorCQkJCQ0KKwkJLy8gSWYgdGhlIFBIUCBpbnN0YWxsYXRpb24gZG9lcyBub3Qgc3VwcG9ydCBzaG9ydCB0YWdzIHdlJ2xsDQorCQkvLyBkbyBhIGxpdHRsZSBzdHJpbmcgcmVwbGFjZW1lbnQsIGNoYW5naW5nIHRoZSBzaG9ydCB0YWdzDQorCQkvLyB0byBzdGFuZGFyZCBQSFAgZWNobyBzdGF0ZW1lbnRzLg0KKwkJDQorCQlpZiAoKGJvb2wpIEBpbmlfZ2V0KCdzaG9ydF9vcGVuX3RhZycpID09PSBGQUxTRSBBTkQgY29uZmlnX2l0ZW0oJ3Jld3JpdGVfc2hvcnRfdGFncycpID09IFRSVUUpDQorCQl7DQorCQkJZWNobyBldmFsKCc/PicucHJlZ19yZXBsYWNlKCIvOypccypcPz4vIiwgIjsgPz4iLCBzdHJfcmVwbGFjZSgnPD89JywgJzw/cGhwIGVjaG8gJywgZmlsZV9nZXRfY29udGVudHMoJHBhdGgpKSkuJzw/cGhwICcpOw0KKwkJfQ0KKwkJZWxzZQ0KKwkJew0KKwkJCWluY2x1ZGUoJHBhdGgpOw0KKwkJfQ0KKwkJDQorCQlsb2dfbWVzc2FnZSgnZGVidWcnLCAnRmlsZSBsb2FkZWQ6ICcuJHBhdGgpOw0KKwkJDQorCQkvLyBSZXR1cm4gdGhlIGZpbGUgZGF0YSBpZiByZXF1ZXN0ZWQNCisJCWlmICgkcmV0dXJuID09PSBUUlVFKQ0KKwkJewkJDQorCQkJJGJ1ZmZlciA9IG9iX2dldF9jb250ZW50cygpOw0KKwkJCUBvYl9lbmRfY2xlYW4oKTsNCisJCQlyZXR1cm4gJGJ1ZmZlcjsNCisJCX0NCisNCisJCS8qDQorCQkgKiBGbHVzaCB0aGUgYnVmZmVyLi4uIG9yIGJ1ZmYgdGhlIGZsdXNoZXI/DQorCQkgKg0KKwkJICogSW4gb3JkZXIgdG8gcGVybWl0IHZpZXdzIHRvIGJlIG5lc3RlZCB3aXRoaW4NCisJCSAqIG90aGVyIHZpZXdzLCB3ZSBuZWVkIHRvIGZsdXNoIHRoZSBjb250ZW50IGJhY2sgb3V0IHdoZW5ldmVyDQorCQkgKiB3ZSBhcmUgYmV5b25kIHRoZSBmaXJzdCBsZXZlbCBvZiBvdXRwdXQgYnVmZmVyaW5nIHNvIHRoYXQNCisJCSAqIGl0IGNhbiBiZSBzZWVuIGFuZCBpbmNsdWRlZCBwcm9wZXJseSBieSB0aGUgZmlyc3QgaW5jbHVkZWQNCisJCSAqIHRlbXBsYXRlIGFuZCBhbnkgc3Vic2VxdWVudCBvbmVzLiBPeSENCisJCSAqDQorCQkgKi8JDQorCQlpZiAob2JfZ2V0X2xldmVsKCkgPiAkdGhpcy0+X2NpX29iX2xldmVsICsgMSkNCisJCXsNCisJCQlvYl9lbmRfZmx1c2goKTsNCisJCX0NCisJCWVsc2UNCisJCXsNCisJCQkvLyBQSFAgNCByZXF1aXJlcyB0aGF0IHdlIHVzZSBhIGdsb2JhbA0KKwkJCWdsb2JhbCAkT1VUOw0KKwkJCSRPVVQtPnNldF9vdXRwdXQob2JfZ2V0X2NvbnRlbnRzKCkpOw0KKwkJCUBvYl9lbmRfY2xlYW4oKTsNCisJCX0NCisJfQ0KKw0KKwkvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KKw0KKwkvKioNCisJICogTG9hZCBjbGFzcw0KKwkgKg0KKwkgKiBUaGlzIGZ1bmN0aW9uIGxvYWRzIHRoZSByZXF1ZXN0ZWQgY2xhc3MuDQorCSAqDQorCSAqIEBhY2Nlc3MJcHJpdmF0ZQ0KKwkgKiBAcGFyYW0gCXN0cmluZwl0aGUgaXRlbSB0aGF0IGlzIGJlaW5nIGxvYWRlZA0KKwkgKiBAcGFyYW0JbWl4ZWQJYW55IGFkZGl0aW9uYWwgcGFyYW1ldGVycw0KKwkgKiBAcmV0dXJuIAl2b2lkDQorCSAqLw0KKwlmdW5jdGlvbiBfY2lfbG9hZF9jbGFzcygkY2xhc3MsICRwYXJhbXMgPSBOVUxMKQ0KKwl7CQ0KKwkJLy8gR2V0IHRoZSBjbGFzcyBuYW1lDQorCQkkY2xhc3MgPSBzdHJfcmVwbGFjZShFWFQsICcnLCAkY2xhc3MpOw0KKw0KKwkJLy8gV2UnbGwgdGVzdCBmb3IgYm90aCBsb3dlcmNhc2UgYW5kIGNhcGl0YWxpemVkIHZlcnNpb25zIG9mIHRoZSBmaWxlIG5hbWUNCisJCWZvcmVhY2ggKGFycmF5KHVjZmlyc3QoJGNsYXNzKSwgc3RydG9sb3dlcigkY2xhc3MpKSBhcyAkY2xhc3MpDQorCQl7DQorCQkJLy8gSXMgdGhpcyBhIGNsYXNzIGV4dGVuc2lvbiByZXF1ZXN0Pw0KKwkJCWlmIChmaWxlX2V4aXN0cyhBUFBQQVRILidsaWJyYXJpZXMvJy5jb25maWdfaXRlbSgnc3ViY2xhc3NfcHJlZml4JykuJGNsYXNzLkVYVCkpDQorCQkJew0KKwkJCQlpZiAoICEgZmlsZV9leGlzdHMoQkFTRVBBVEguJ2xpYnJhcmllcy8nLnVjZmlyc3QoJGNsYXNzKS5FWFQpKQ0KKwkJCQl7DQorCQkJCQlsb2dfbWVzc2FnZSgnZXJyb3InLCAiVW5hYmxlIHRvIGxvYWQgdGhlIHJlcXVlc3RlZCBjbGFzczogIi4kY2xhc3MpOw0KKwkJCQkJc2hvd19lcnJvcigiVW5hYmxlIHRvIGxvYWQgdGhlIHJlcXVlc3RlZCBjbGFzczogIi4kY2xhc3MpOw0KKwkJCQl9DQorCQ0KKwkJCQlpbmNsdWRlKEJBU0VQQVRILidsaWJyYXJpZXMvJy51Y2ZpcnN0KCRjbGFzcykuRVhUKTsNCisJCQkJaW5jbHVkZShBUFBQQVRILidsaWJyYXJpZXMvJy5jb25maWdfaXRlbSgnc3ViY2xhc3NfcHJlZml4JykuJGNsYXNzLkVYVCk7DQorCQ0KKwkJCQlyZXR1cm4gJHRoaXMtPl9jaV9pbml0X2NsYXNzKCRjbGFzcywgY29uZmlnX2l0ZW0oJ3N1YmNsYXNzX3ByZWZpeCcpLCAkcGFyYW1zKTsJCQkNCisJCQl9DQorCQkNCisJCQkvLyBMZXRzIHNlYXJjaCBmb3IgdGhlIHJlcXVlc3RlZCBsaWJyYXJ5IGZpbGUgYW5kIGxvYWQgaXQuDQorCQkJZm9yICgkaSA9IDE7ICRpIDwgMzsgJGkrKykNCisJCQl7DQorCQkJCSRwYXRoID0gKCRpICUgMikgPyBBUFBQQVRIIDogQkFTRVBBVEg7CQ0KKwkJCQkkZnAgPSAkcGF0aC4nbGlicmFyaWVzLycuJGNsYXNzLkVYVDsNCisJCQkJDQorCQkJCS8vIERvZXMgdGhlIGZpbGUgZXhpc3Q/ICBObz8gIEJ1bW1lci4uLg0KKwkJCQlpZiAoICEgZmlsZV9leGlzdHMoJGZwKSkNCisJCQkJew0KKwkJCQkJY29udGludWU7DQorCQkJCX0NCisJCQkJDQorCQkJCS8vIFNhZmV0eTogIFdhcyB0aGUgY2xhc3MgYWxyZWFkeSBsb2FkZWQgYnkgYSBwcmV2aW91cyBjYWxsPw0KKwkJCQlpZiAoaW5fYXJyYXkoJGZwLCAkdGhpcy0+X2NpX2NsYXNzZXMpKQ0KKwkJCQl7DQorCQkJCQlsb2dfbWVzc2FnZSgnZGVidWcnLCAkY2xhc3MuIiBjbGFzcyBhbHJlYWR5IGxvYWRlZC4gU2Vjb25kIGF0dGVtcHQgaWdub3JlZC4iKTsNCisJCQkJCXJldHVybjsNCisJCQkJfQ0KKwkJCQkNCisJCQkJaW5jbHVkZSgkZnApOw0KKwkJCQkkdGhpcy0+X2NpX2NsYXNzZXNbXSA9ICRmcDsNCisJCQkJcmV0dXJuICR0aGlzLT5fY2lfaW5pdF9jbGFzcygkY2xhc3MsICcnLCAkcGFyYW1zKTsNCisJCQl9DQorCQl9IC8vIEVORCBGT1JFQUNIDQorCQkNCisJCS8vIElmIHdlIGdvdCB0aGlzIGZhciB3ZSB3ZXJlIHVuYWJsZSB0byBmaW5kIHRoZSByZXF1ZXN0ZWQgY2xhc3MuDQorCQkvLyBXZSBkbyBub3QgaXNzdWUgZXJyb3JzIGlmIHRoZSBsb2FkIGNhbGwgZmFpbGVkIGR1ZSB0byBhIGR1cGxpY2F0ZSByZXF1ZXN0DQorCQlpZiAoJGlzX2R1cGxpY2F0ZSA9PSBGQUxTRSkNCisJCXsNCisJCQlsb2dfbWVzc2FnZSgnZXJyb3InLCAiVW5hYmxlIHRvIGxvYWQgdGhlIHJlcXVlc3RlZCBjbGFzczogIi4kY2xhc3MpOw0KKwkJCXNob3dfZXJyb3IoIlVuYWJsZSB0byBsb2FkIHRoZSByZXF1ZXN0ZWQgY2xhc3M6ICIuJGNsYXNzKTsNCisJCX0NCisJfQ0KKwkNCisJLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCisNCisJLyoqDQorCSAqIEluc3RhbnRpYXRlcyBhIGNsYXNzDQorCSAqDQorCSAqIEBhY2Nlc3MJcHJpdmF0ZQ0KKwkgKiBAcGFyYW0Jc3RyaW5nDQorCSAqIEBwYXJhbQlzdHJpbmcNCisJICogQHJldHVybgludWxsDQorCSAqLw0KKwlmdW5jdGlvbiBfY2lfaW5pdF9jbGFzcygkY2xhc3MsICRwcmVmaXggPSAnJywgJGNvbmZpZyA9IEZBTFNFKQ0KKwl7CQ0KKwkJLy8gSXMgdGhlcmUgYW4gYXNzb2NpYXRlZCBjb25maWcgZmlsZSBmb3IgdGhpcyBjbGFzcz8NCisJCWlmICgkY29uZmlnID09PSBOVUxMKQ0KKwkJew0KKwkJCSRjb25maWcgPSBOVUxMOw0KKwkJCWlmIChmaWxlX2V4aXN0cyhBUFBQQVRILidjb25maWcvJy4kY2xhc3MuRVhUKSkNCisJCQl7DQorCQkJCWluY2x1ZGUoQVBQUEFUSC4nY29uZmlnLycuJGNsYXNzLkVYVCk7DQorCQkJfQ0KKwkJfQ0KKwkJDQorCQlpZiAoJHByZWZpeCA9PSAnJykNCisJCXsNCisJCQkkbmFtZSA9IChjbGFzc19leGlzdHMoJ0NJXycuJGNsYXNzKSkgPyAnQ0lfJy4kY2xhc3MgOiAkY2xhc3M7DQorCQl9DQorCQllbHNlDQorCQl7DQorCQkJJG5hbWUgPSAkcHJlZml4LiRjbGFzczsNCisJCX0NCisJCQ0KKwkJLy8gU2V0IHRoZSB2YXJpYWJsZSBuYW1lIHdlIHdpbGwgYXNzaWduIHRoZSBjbGFzcyB0bw0KKwkJJGNsYXNzID0gc3RydG9sb3dlcigkY2xhc3MpOwkJCQ0KKwkJJGNsYXNzdmFyID0gKCAhIGlzc2V0KCR0aGlzLT5fY2lfdmFybWFwWyRjbGFzc10pKSA/ICRjbGFzcyA6ICR0aGlzLT5fY2lfdmFybWFwWyRjbGFzc107DQorCQkJCQ0KKwkJLy8gSW5zdGFudGlhdGUgdGhlIGNsYXNzCQkNCisJCSRDSSA9JiBnZXRfaW5zdGFuY2UoKTsNCisJCWlmICgkY29uZmlnICE9PSBOVUxMKQ0KKwkJew0KKwkJCSRDSS0+JGNsYXNzdmFyID0gbmV3ICRuYW1lKCRjb25maWcpOw0KKwkJfQ0KKwkJZWxzZQ0KKwkJewkJDQorCQkJJENJLT4kY2xhc3N2YXIgPSBuZXcgJG5hbWU7DQorCQl9CQ0KKwl9IAkNCisJDQorCS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQorCQ0KKwkvKioNCisJICogQXV0b2xvYWRlcg0KKwkgKg0KKwkgKiBUaGUgY29uZmlnL2F1dG9sb2FkLnBocCBmaWxlIGNvbnRhaW5zIGFuIGFycmF5IHRoYXQgcGVybWl0cyBzdWItc3lzdGVtcywNCisJICogbGlicmFyaWVzLCBwbHVnaW5zLCBhbmQgaGVscGVycyB0byBiZSBsb2FkZWQgYXV0b21hdGljYWxseS4NCisJICoNCisJICogQGFjY2Vzcwlwcml2YXRlDQorCSAqIEBwYXJhbQlhcnJheQ0KKwkgKiBAcmV0dXJuCXZvaWQNCisJICovDQorCWZ1bmN0aW9uIF9jaV9hdXRvbG9hZGVyKCkNCisJewkNCisJCWluY2x1ZGUoQVBQUEFUSC4nY29uZmlnL2F1dG9sb2FkJy5FWFQpOw0KKwkJDQorCQlpZiAoICEgaXNzZXQoJGF1dG9sb2FkKSkNCisJCXsNCisJCQlyZXR1cm4gRkFMU0U7DQorCQl9DQorCQkNCisJCS8vIExvYWQgYW55IGN1c3RvbWUgY29uZmlnIGZpbGUNCisJCWlmIChjb3VudCgkYXV0b2xvYWRbJ2NvbmZpZyddKSA+IDApDQorCQl7CQkJDQorCQkJJENJID0mIGdldF9pbnN0YW5jZSgpOw0KKwkJCWZvcmVhY2ggKCRhdXRvbG9hZFsnY29uZmlnJ10gYXMgJGtleSA9PiAkdmFsKQ0KKwkJCXsNCisJCQkJJENJLT5jb25maWctPmxvYWQoJHZhbCk7DQorCQkJfQ0KKwkJfQkJDQorDQorCQkvLyBMb2FkIHBsdWdpbnMsIGhlbHBlcnMsIGFuZCBzY3JpcHRzDQorCQlmb3JlYWNoIChhcnJheSgnaGVscGVyJywgJ3BsdWdpbicsICdzY3JpcHQnKSBhcyAkdHlwZSkNCisJCXsNCisJCQlpZiAoaXNzZXQoJGF1dG9sb2FkWyR0eXBlXSkgQU5EIGNvdW50KCRhdXRvbG9hZFskdHlwZV0pID4gMCkNCisJCQl7DQorCQkJCSR0aGlzLT4kdHlwZSgkYXV0b2xvYWRbJHR5cGVdKTsNCisJCQl9CQkNCisJCX0NCisJCQ0KKwkJLy8gQSBsaXR0bGUgdHdlYWsgdG8gcmVtYWluIGJhY2t3YXJkIGNvbXBhdGlibGUNCisJCS8vIFRoZSAkYXV0b2xvYWRbJ2NvcmUnXSBpdGVtIHdhcyBkZXByZWNhdGVkDQorCQlpZiAoICEgaXNzZXQoJGF1dG9sb2FkWydsaWJyYXJpZXMnXSkpDQorCQl7DQorCQkJJGF1dG9sb2FkWydsaWJyYXJpZXMnXSA9ICRhdXRvbG9hZFsnY29yZSddOw0KKwkJfQ0KKwkJDQorCQkvLyBMb2FkIGxpYnJhcmllcw0KKwkJaWYgKGlzc2V0KCRhdXRvbG9hZFsnbGlicmFyaWVzJ10pIEFORCBjb3VudCgkYXV0b2xvYWRbJ2xpYnJhcmllcyddKSA+IDApDQorCQl7DQorCQkJLy8gTG9hZCB0aGUgZGF0YWJhc2UgZHJpdmVyLg0KKwkJCWlmIChpbl9hcnJheSgnZGF0YWJhc2UnLCAkYXV0b2xvYWRbJ2xpYnJhcmllcyddKSkNCisJCQl7DQorCQkJCSR0aGlzLT5kYXRhYmFzZSgpOw0KKwkJCQkkYXV0b2xvYWRbJ2xpYnJhcmllcyddID0gYXJyYXlfZGlmZigkYXV0b2xvYWRbJ2xpYnJhcmllcyddLCBhcnJheSgnZGF0YWJhc2UnKSk7DQorCQkJfQ0KKw0KKwkJCS8vIExvYWQgdGhlIG1vZGVsIGNsYXNzLg0KKwkJCWlmIChpbl9hcnJheSgnbW9kZWwnLCAkYXV0b2xvYWRbJ2xpYnJhcmllcyddKSkNCisJCQl7DQorCQkJCSR0aGlzLT5tb2RlbCgpOw0KKwkJCQkkYXV0b2xvYWRbJ2xpYnJhcmllcyddID0gYXJyYXlfZGlmZigkYXV0b2xvYWRbJ2xpYnJhcmllcyddLCBhcnJheSgnbW9kZWwnKSk7DQorCQkJfQ0KKw0KKwkJCS8vIExvYWQgc2NhZmZvbGRpbmcNCisJCQlpZiAoaW5fYXJyYXkoJ3NjYWZmb2xkaW5nJywgJGF1dG9sb2FkWydsaWJyYXJpZXMnXSkpDQorCQkJew0KKwkJCQkkdGhpcy0+c2NhZmZvbGRpbmcoKTsNCisJCQkJJGF1dG9sb2FkWydsaWJyYXJpZXMnXSA9IGFycmF5X2RpZmYoJGF1dG9sb2FkWydsaWJyYXJpZXMnXSwgYXJyYXkoJ3NjYWZmb2xkaW5nJykpOw0KKwkJCX0NCisJCQ0KKwkJCS8vIExvYWQgYWxsIG90aGVyIGxpYnJhcmllcw0KKwkJCWZvcmVhY2ggKCRhdXRvbG9hZFsnbGlicmFyaWVzJ10gYXMgJGl0ZW0pDQorCQkJew0KKwkJCQkkdGhpcy0+bGlicmFyeSgkaXRlbSk7DQorCQkJfQ0KKwkJfQkJDQorCX0NCisJDQorCS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQorDQorCS8qKg0KKwkgKiBBc3NpZ24gdG8gTW9kZWxzDQorCSAqDQorCSAqIE1ha2VzIHN1cmUgdGhhdCBhbnl0aGluZyBsb2FkZWQgYnkgdGhlIGxvYWRlciBjbGFzcyAobGlicmFyaWVzLCBwbHVnaW5zLCBldGMuKQ0KKwkgKiB3aWxsIGJlIGF2YWlsYWJsZSB0byBtb2RlbHMsIGlmIGFueSBleGlzdC4NCisJICoNCisJICogQGFjY2Vzcwlwcml2YXRlDQorCSAqIEBwYXJhbQlvYmplY3QNCisJICogQHJldHVybglhcnJheQ0KKwkgKi8NCisJZnVuY3Rpb24gX2NpX2Fzc2lnbl90b19tb2RlbHMoKQ0KKwl7DQorCQlpZiAoY291bnQoJHRoaXMtPl9jaV9tb2RlbHMpID09IDApDQorCQl7DQorCQkJcmV0dXJuOw0KKwkJfQ0KKwkNCisJCWlmICgkdGhpcy0+X2NpX2lzX2luc3RhbmNlKCkpDQorCQl7DQorCQkJJENJID0mIGdldF9pbnN0YW5jZSgpOw0KKwkJCWZvcmVhY2ggKCR0aGlzLT5fY2lfbW9kZWxzIGFzICRtb2RlbCkNCisJCQl7CQkJDQorCQkJCSRDSS0+JG1vZGVsLT5fYXNzaWduX2xpYnJhcmllcygpOw0KKwkJCX0NCisJCX0NCisJCWVsc2UNCisJCXsJCQ0KKwkJCWZvcmVhY2ggKCR0aGlzLT5fY2lfbW9kZWxzIGFzICRtb2RlbCkNCisJCQl7CQkJDQorCQkJCSR0aGlzLT4kbW9kZWwtPl9hc3NpZ25fbGlicmFyaWVzKCk7DQorCQkJfQ0KKwkJfQ0KKwl9ICAJDQorDQorCS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQorDQorCS8qKg0KKwkgKiBPYmplY3QgdG8gQXJyYXkNCisJICoNCisJICogVGFrZXMgYW4gb2JqZWN0IGFzIGlucHV0IGFuZCBjb252ZXJ0cyB0aGUgY2xhc3MgdmFyaWFibGVzIHRvIGFycmF5IGtleS92YWxzDQorCSAqDQorCSAqIEBhY2Nlc3MJcHJpdmF0ZQ0KKwkgKiBAcGFyYW0Jb2JqZWN0DQorCSAqIEByZXR1cm4JYXJyYXkNCisJICovDQorCWZ1bmN0aW9uIF9jaV9vYmplY3RfdG9fYXJyYXkoJG9iamVjdCkNCisJew0KKwkJcmV0dXJuIChpc19vYmplY3QoJG9iamVjdCkpID8gZ2V0X29iamVjdF92YXJzKCRvYmplY3QpIDogJG9iamVjdDsNCisJfQ0KKw0KKwkvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KKw0KKwkvKioNCisJICogRGV0ZXJtaW5lcyB3aGV0aGVyIHdlIHNob3VsZCB1c2UgdGhlIENJIGluc3RhbmNlIG9yICR0aGlzDQorCSAqDQorCSAqIEBhY2Nlc3MJcHJpdmF0ZQ0KKwkgKiBAcmV0dXJuCWJvb2wNCisJICovDQorCWZ1bmN0aW9uIF9jaV9pc19pbnN0YW5jZSgpDQorCXsNCisJCWlmICgkdGhpcy0+X2NpX2lzX3BocDUgPT0gVFJVRSkNCisJCXsNCisJCQlyZXR1cm4gVFJVRTsNCisJCX0NCisJDQorCQlnbG9iYWwgJENJOw0KKwkJcmV0dXJuIChpc19vYmplY3QoJENJKSkgPyBUUlVFIDogRkFMU0U7DQorCX0NCisJDQorfQ0KID8+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQo=